ffi-nats-core 0.3.0 → 0.3.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/ffi-nats-core.gemspec +8 -0
- data/lib/ffi/nats/core/version.rb +1 -1
- data/vendor/cnats/CMakeLists.txt +137 -0
- data/vendor/cnats/adapters/libevent.h +220 -0
- data/vendor/cnats/adapters/libuv.h +472 -0
- data/vendor/cnats/examples/CMakeLists.txt +56 -0
- data/vendor/cnats/examples/asynctimeout.c +83 -0
- data/vendor/cnats/examples/examples.h +322 -0
- data/vendor/cnats/examples/libevent-pub.c +136 -0
- data/vendor/cnats/examples/libevent-sub.c +104 -0
- data/vendor/cnats/examples/libuv-pub.c +120 -0
- data/vendor/cnats/examples/libuv-sub.c +114 -0
- data/vendor/cnats/examples/publisher.c +62 -0
- data/vendor/cnats/examples/queuegroup.c +132 -0
- data/vendor/cnats/examples/replier.c +149 -0
- data/vendor/cnats/examples/requestor.c +75 -0
- data/vendor/cnats/examples/subscriber.c +133 -0
- data/vendor/cnats/src/CMakeLists.txt +31 -0
- data/vendor/cnats/src/asynccb.c +66 -0
- data/vendor/cnats/src/asynccb.h +42 -0
- data/vendor/cnats/src/buf.c +246 -0
- data/vendor/cnats/src/buf.h +116 -0
- data/vendor/cnats/src/comsock.c +474 -0
- data/vendor/cnats/src/comsock.h +81 -0
- data/vendor/cnats/src/conn.c +2725 -0
- data/vendor/cnats/src/conn.h +75 -0
- data/vendor/cnats/src/err.h +31 -0
- data/vendor/cnats/src/gc.h +27 -0
- data/vendor/cnats/src/hash.c +725 -0
- data/vendor/cnats/src/hash.h +141 -0
- data/vendor/cnats/src/include/n-unix.h +56 -0
- data/vendor/cnats/src/include/n-win.h +59 -0
- data/vendor/cnats/src/mem.h +20 -0
- data/vendor/cnats/src/msg.c +155 -0
- data/vendor/cnats/src/msg.h +43 -0
- data/vendor/cnats/src/nats.c +1734 -0
- data/vendor/cnats/src/nats.h +2024 -0
- data/vendor/cnats/src/natsp.h +518 -0
- data/vendor/cnats/src/natstime.c +79 -0
- data/vendor/cnats/src/natstime.h +27 -0
- data/vendor/cnats/src/nuid.c +265 -0
- data/vendor/cnats/src/nuid.h +21 -0
- data/vendor/cnats/src/opts.c +1030 -0
- data/vendor/cnats/src/opts.h +19 -0
- data/vendor/cnats/src/parser.c +869 -0
- data/vendor/cnats/src/parser.h +87 -0
- data/vendor/cnats/src/pub.c +293 -0
- data/vendor/cnats/src/srvpool.c +380 -0
- data/vendor/cnats/src/srvpool.h +71 -0
- data/vendor/cnats/src/stats.c +54 -0
- data/vendor/cnats/src/stats.h +21 -0
- data/vendor/cnats/src/status.c +60 -0
- data/vendor/cnats/src/status.h +95 -0
- data/vendor/cnats/src/sub.c +956 -0
- data/vendor/cnats/src/sub.h +34 -0
- data/vendor/cnats/src/timer.c +86 -0
- data/vendor/cnats/src/timer.h +57 -0
- data/vendor/cnats/src/unix/cond.c +103 -0
- data/vendor/cnats/src/unix/mutex.c +107 -0
- data/vendor/cnats/src/unix/sock.c +105 -0
- data/vendor/cnats/src/unix/thread.c +162 -0
- data/vendor/cnats/src/url.c +134 -0
- data/vendor/cnats/src/url.h +24 -0
- data/vendor/cnats/src/util.c +823 -0
- data/vendor/cnats/src/util.h +75 -0
- data/vendor/cnats/src/version.h +29 -0
- data/vendor/cnats/src/version.h.in +29 -0
- data/vendor/cnats/src/win/cond.c +86 -0
- data/vendor/cnats/src/win/mutex.c +54 -0
- data/vendor/cnats/src/win/sock.c +158 -0
- data/vendor/cnats/src/win/strings.c +108 -0
- data/vendor/cnats/src/win/thread.c +180 -0
- data/vendor/cnats/test/CMakeLists.txt +35 -0
- data/vendor/cnats/test/certs/ca.pem +38 -0
- data/vendor/cnats/test/certs/client-cert.pem +30 -0
- data/vendor/cnats/test/certs/client-key.pem +51 -0
- data/vendor/cnats/test/certs/server-cert.pem +31 -0
- data/vendor/cnats/test/certs/server-key.pem +51 -0
- data/vendor/cnats/test/dylib/CMakeLists.txt +10 -0
- data/vendor/cnats/test/dylib/nonats.c +13 -0
- data/vendor/cnats/test/list.txt +125 -0
- data/vendor/cnats/test/test.c +11655 -0
- data/vendor/cnats/test/tls.conf +15 -0
- data/vendor/cnats/test/tlsverify.conf +19 -0
- metadata +83 -1
@@ -0,0 +1,141 @@
|
|
1
|
+
// Copyright 2015 Apcera Inc. All rights reserved.
|
2
|
+
|
3
|
+
|
4
|
+
#ifndef HASH_H_
|
5
|
+
#define HASH_H_
|
6
|
+
|
7
|
+
struct __natsHashEntry;
|
8
|
+
|
9
|
+
typedef struct __natsHashEntry
|
10
|
+
{
|
11
|
+
int64_t key;
|
12
|
+
void *data;
|
13
|
+
struct __natsHashEntry *next;
|
14
|
+
|
15
|
+
} natsHashEntry;
|
16
|
+
|
17
|
+
typedef struct __natsHash
|
18
|
+
{
|
19
|
+
natsHashEntry **bkts;
|
20
|
+
int numBkts;
|
21
|
+
int mask;
|
22
|
+
int used;
|
23
|
+
bool canResize;
|
24
|
+
|
25
|
+
} natsHash;
|
26
|
+
|
27
|
+
typedef struct __natsHashIter
|
28
|
+
{
|
29
|
+
natsHash *hash;
|
30
|
+
natsHashEntry *current;
|
31
|
+
natsHashEntry *next;
|
32
|
+
int currBkt;
|
33
|
+
bool started;
|
34
|
+
|
35
|
+
} natsHashIter;
|
36
|
+
|
37
|
+
typedef struct __natsStrHashEntry
|
38
|
+
{
|
39
|
+
uint32_t hk;
|
40
|
+
char *key;
|
41
|
+
bool freeKey;
|
42
|
+
void *data;
|
43
|
+
struct __natsStrHashEntry *next;
|
44
|
+
|
45
|
+
} natsStrHashEntry;
|
46
|
+
|
47
|
+
typedef struct __natsStrHash
|
48
|
+
{
|
49
|
+
natsStrHashEntry **bkts;
|
50
|
+
int numBkts;
|
51
|
+
int mask;
|
52
|
+
int used;
|
53
|
+
bool canResize;
|
54
|
+
|
55
|
+
} natsStrHash;
|
56
|
+
|
57
|
+
typedef struct __natsStrHashIter
|
58
|
+
{
|
59
|
+
natsStrHash *hash;
|
60
|
+
natsStrHashEntry *current;
|
61
|
+
natsStrHashEntry *next;
|
62
|
+
int currBkt;
|
63
|
+
bool started;
|
64
|
+
|
65
|
+
} natsStrHashIter;
|
66
|
+
|
67
|
+
#define natsHash_Count(h) ((h)->used)
|
68
|
+
#define natsStrHash_Count(h) ((h)->used)
|
69
|
+
|
70
|
+
//
|
71
|
+
// Hash with in64_t as the key
|
72
|
+
//
|
73
|
+
natsStatus
|
74
|
+
natsHash_Create(natsHash **newHash, int initialSize);
|
75
|
+
|
76
|
+
natsStatus
|
77
|
+
natsHash_Set(natsHash *hash, int64_t key, void *data, void **oldData);
|
78
|
+
|
79
|
+
void*
|
80
|
+
natsHash_Get(natsHash *hash, int64_t key);
|
81
|
+
|
82
|
+
void*
|
83
|
+
natsHash_Remove(natsHash *hash, int64_t key);
|
84
|
+
|
85
|
+
void
|
86
|
+
natsHash_Destroy(natsHash *hash);
|
87
|
+
|
88
|
+
//
|
89
|
+
// Iterator for Hash int64_t
|
90
|
+
//
|
91
|
+
void
|
92
|
+
natsHashIter_Init(natsHashIter *iter, natsHash *hash);
|
93
|
+
|
94
|
+
bool
|
95
|
+
natsHashIter_Next(natsHashIter *iter, int64_t *key, void **value);
|
96
|
+
|
97
|
+
natsStatus
|
98
|
+
natsHashIter_RemoveCurrent(natsHashIter *iter);
|
99
|
+
|
100
|
+
void
|
101
|
+
natsHashIter_Done(natsHashIter *iter);
|
102
|
+
|
103
|
+
//
|
104
|
+
// Hash with char* as the key
|
105
|
+
//
|
106
|
+
natsStatus
|
107
|
+
natsStrHash_Create(natsStrHash **newHash, int initialSize);
|
108
|
+
|
109
|
+
uint32_t
|
110
|
+
natsStrHash_Hash(const char *data, int dataLen);
|
111
|
+
|
112
|
+
natsStatus
|
113
|
+
natsStrHash_Set(natsStrHash *hash, char *key, bool copyKey,
|
114
|
+
void *data, void **oldData);
|
115
|
+
|
116
|
+
void*
|
117
|
+
natsStrHash_Get(natsStrHash *hash, char *key);
|
118
|
+
|
119
|
+
void*
|
120
|
+
natsStrHash_Remove(natsStrHash *hash, char *key);
|
121
|
+
|
122
|
+
void
|
123
|
+
natsStrHash_Destroy(natsStrHash *hash);
|
124
|
+
|
125
|
+
//
|
126
|
+
// Iterator for Hash char*
|
127
|
+
//
|
128
|
+
void
|
129
|
+
natsStrHashIter_Init(natsStrHashIter *iter, natsStrHash *hash);
|
130
|
+
|
131
|
+
bool
|
132
|
+
natsStrHashIter_Next(natsStrHashIter *iter, char **key, void **value);
|
133
|
+
|
134
|
+
natsStatus
|
135
|
+
natsStrHashIter_RemoveCurrent(natsStrHashIter *iter);
|
136
|
+
|
137
|
+
void
|
138
|
+
natsStrHashIter_Done(natsStrHashIter *iter);
|
139
|
+
|
140
|
+
|
141
|
+
#endif /* HASH_H_ */
|
@@ -0,0 +1,56 @@
|
|
1
|
+
// Copyright 2015 Apcera Inc. All rights reserved.
|
2
|
+
|
3
|
+
#ifndef N_UNIX_H_
|
4
|
+
#define N_UNIX_H_
|
5
|
+
|
6
|
+
#ifndef _GNU_SOURCE
|
7
|
+
#define _GNU_SOURCE
|
8
|
+
#endif
|
9
|
+
|
10
|
+
#include <stdint.h>
|
11
|
+
#include <stdbool.h>
|
12
|
+
|
13
|
+
#ifdef DARWIN
|
14
|
+
#define FD_SETSIZE (32768)
|
15
|
+
#else
|
16
|
+
#include <sys/types.h>
|
17
|
+
#undef __FD_SETSIZE
|
18
|
+
#define __FD_SETSIZE (32768)
|
19
|
+
#include <sys/select.h>
|
20
|
+
#endif
|
21
|
+
|
22
|
+
#include <sys/time.h>
|
23
|
+
#include <fcntl.h>
|
24
|
+
#include <netinet/tcp.h>
|
25
|
+
#include <netdb.h>
|
26
|
+
#include <pthread.h>
|
27
|
+
#include <unistd.h>
|
28
|
+
#include <signal.h>
|
29
|
+
#include <sys/wait.h>
|
30
|
+
#include <errno.h>
|
31
|
+
#include <string.h>
|
32
|
+
|
33
|
+
typedef pthread_t natsThread;
|
34
|
+
typedef pthread_key_t natsThreadLocal;
|
35
|
+
typedef pthread_mutex_t natsMutex;
|
36
|
+
typedef pthread_cond_t natsCondition;
|
37
|
+
typedef pthread_once_t natsInitOnceType;
|
38
|
+
typedef socklen_t natsSockLen;
|
39
|
+
typedef size_t natsRecvLen;
|
40
|
+
|
41
|
+
#define NATS_ONCE_STATIC_INIT PTHREAD_ONCE_INIT
|
42
|
+
|
43
|
+
#define NATS_SOCK_INVALID (-1)
|
44
|
+
#define NATS_SOCK_SHUTDOWN(s) (shutdown((s), SHUT_RDWR))
|
45
|
+
#define NATS_SOCK_CLOSE(s) (close((s)))
|
46
|
+
#define NATS_SOCK_CONNECT_IN_PROGRESS (EINPROGRESS)
|
47
|
+
#define NATS_SOCK_WOULD_BLOCK (EWOULDBLOCK)
|
48
|
+
#define NATS_SOCK_ERROR (-1)
|
49
|
+
#define NATS_SOCK_GET_ERROR (errno)
|
50
|
+
|
51
|
+
#define __NATS_FUNCTION__ __func__
|
52
|
+
|
53
|
+
#define nats_asprintf asprintf
|
54
|
+
#define nats_strcasestr strcasestr
|
55
|
+
|
56
|
+
#endif /* N_UNIX_H_ */
|
@@ -0,0 +1,59 @@
|
|
1
|
+
// Copyright 2015 Apcera Inc. All rights reserved.
|
2
|
+
|
3
|
+
#ifndef N_WIN_H_
|
4
|
+
#define N_WIN_H_
|
5
|
+
|
6
|
+
#include <winsock2.h>
|
7
|
+
#include <ws2tcpip.h>
|
8
|
+
|
9
|
+
#define WIN32_LEAN_AND_MEAN
|
10
|
+
#include <windows.h>
|
11
|
+
#undef WIN32_LEAN_AND_MEAN
|
12
|
+
|
13
|
+
#define _CRT_SECURE_NO_WARNINGS
|
14
|
+
|
15
|
+
#pragma comment(lib, "Ws2_32.lib")
|
16
|
+
#pragma warning(disable : 4996)
|
17
|
+
|
18
|
+
typedef struct __natsThread
|
19
|
+
{
|
20
|
+
HANDLE t;
|
21
|
+
DWORD id;
|
22
|
+
|
23
|
+
} natsThread;
|
24
|
+
|
25
|
+
typedef DWORD natsThreadLocal;
|
26
|
+
|
27
|
+
typedef CRITICAL_SECTION natsMutex;
|
28
|
+
typedef CONDITION_VARIABLE natsCondition;
|
29
|
+
typedef INIT_ONCE natsInitOnceType;
|
30
|
+
typedef int natsSockLen;
|
31
|
+
typedef int natsRecvLen;
|
32
|
+
|
33
|
+
#define NATS_ONCE_TYPE INIT_ONCE
|
34
|
+
#define NATS_ONCE_STATIC_INIT INIT_ONCE_STATIC_INIT
|
35
|
+
|
36
|
+
#define NATS_SOCK_INVALID (INVALID_SOCKET)
|
37
|
+
#define NATS_SOCK_CLOSE(s) closesocket((s))
|
38
|
+
#define NATS_SOCK_SHUTDOWN(s) shutdown((s), SD_BOTH)
|
39
|
+
#define NATS_SOCK_CONNECT_IN_PROGRESS (WSAEWOULDBLOCK)
|
40
|
+
#define NATS_SOCK_WOULD_BLOCK (WSAEWOULDBLOCK)
|
41
|
+
#define NATS_SOCK_ERROR (SOCKET_ERROR)
|
42
|
+
#define NATS_SOCK_GET_ERROR WSAGetLastError()
|
43
|
+
|
44
|
+
#define __NATS_FUNCTION__ __FUNCTION__
|
45
|
+
|
46
|
+
// Windows doesn't have those..
|
47
|
+
// snprintf support is introduced starting MSVC 14.0 (_MSC_VER 1900: Visual Studio 2015)
|
48
|
+
#if _MSC_VER < 1900
|
49
|
+
#define snprintf _snprintf
|
50
|
+
#endif
|
51
|
+
#define strcasecmp _stricmp
|
52
|
+
|
53
|
+
int
|
54
|
+
nats_asprintf(char **newStr, const char *fmt, ...);
|
55
|
+
|
56
|
+
char*
|
57
|
+
nats_strcasestr(const char *haystack, const char *needle);
|
58
|
+
|
59
|
+
#endif /* N_WIN_H_ */
|
@@ -0,0 +1,20 @@
|
|
1
|
+
// Copyright 2015 Apcera Inc. All rights reserved.
|
2
|
+
|
3
|
+
#ifndef MEM_H_
|
4
|
+
#define MEM_H_
|
5
|
+
|
6
|
+
#include <stdlib.h>
|
7
|
+
|
8
|
+
#define NATS_MALLOC(s) malloc((s))
|
9
|
+
#define NATS_CALLOC(c,s) calloc((c), (s))
|
10
|
+
#define NATS_REALLOC(p, s) realloc((p), (s))
|
11
|
+
|
12
|
+
#ifdef _WIN32
|
13
|
+
#define NATS_STRDUP(s) _strdup((s))
|
14
|
+
#else
|
15
|
+
#define NATS_STRDUP(s) strdup((s))
|
16
|
+
#endif
|
17
|
+
#define NATS_FREE(p) free((p))
|
18
|
+
|
19
|
+
|
20
|
+
#endif /* MEM_H_ */
|
@@ -0,0 +1,155 @@
|
|
1
|
+
// Copyright 2015-2016 Apcera Inc. All rights reserved.
|
2
|
+
|
3
|
+
#include "natsp.h"
|
4
|
+
|
5
|
+
// Do this after including natsp.h in order to have some of the
|
6
|
+
// GNU specific flag set first.
|
7
|
+
#include <string.h>
|
8
|
+
|
9
|
+
#include "mem.h"
|
10
|
+
|
11
|
+
void
|
12
|
+
natsMsg_free(void *object)
|
13
|
+
{
|
14
|
+
natsMsg *msg;
|
15
|
+
|
16
|
+
if (object == NULL)
|
17
|
+
return;
|
18
|
+
|
19
|
+
msg = (natsMsg*) object;
|
20
|
+
|
21
|
+
NATS_FREE(msg);
|
22
|
+
}
|
23
|
+
|
24
|
+
void
|
25
|
+
natsMsg_Destroy(natsMsg *msg)
|
26
|
+
{
|
27
|
+
if (msg == NULL)
|
28
|
+
return;
|
29
|
+
|
30
|
+
if (natsGC_collect((natsGCItem *) msg))
|
31
|
+
return;
|
32
|
+
|
33
|
+
natsMsg_free((void*) msg);
|
34
|
+
}
|
35
|
+
|
36
|
+
const char*
|
37
|
+
natsMsg_GetSubject(natsMsg *msg)
|
38
|
+
{
|
39
|
+
if (msg == NULL)
|
40
|
+
return NULL;
|
41
|
+
|
42
|
+
return (const char*) msg->subject;
|
43
|
+
}
|
44
|
+
|
45
|
+
const char*
|
46
|
+
natsMsg_GetReply(natsMsg *msg)
|
47
|
+
{
|
48
|
+
if (msg == NULL)
|
49
|
+
return NULL;
|
50
|
+
|
51
|
+
return (const char*) msg->reply;
|
52
|
+
}
|
53
|
+
|
54
|
+
const char*
|
55
|
+
natsMsg_GetData(natsMsg *msg)
|
56
|
+
{
|
57
|
+
if (msg == NULL)
|
58
|
+
return NULL;
|
59
|
+
|
60
|
+
return (const char*) msg->data;
|
61
|
+
}
|
62
|
+
|
63
|
+
int
|
64
|
+
natsMsg_GetDataLength(natsMsg *msg)
|
65
|
+
{
|
66
|
+
if (msg == NULL)
|
67
|
+
return 0;
|
68
|
+
|
69
|
+
return msg->dataLen;
|
70
|
+
}
|
71
|
+
|
72
|
+
natsStatus
|
73
|
+
natsMsg_create(natsMsg **newMsg,
|
74
|
+
const char *subject, int subjLen,
|
75
|
+
const char *reply, int replyLen,
|
76
|
+
const char *buf, int bufLen)
|
77
|
+
{
|
78
|
+
natsMsg *msg = NULL;
|
79
|
+
char *ptr = NULL;
|
80
|
+
int bufSize = 0;
|
81
|
+
|
82
|
+
bufSize = subjLen;
|
83
|
+
bufSize += 1;
|
84
|
+
bufSize += replyLen;
|
85
|
+
bufSize += 1;
|
86
|
+
bufSize += bufLen;
|
87
|
+
bufSize += 1;
|
88
|
+
|
89
|
+
msg = NATS_MALLOC(sizeof(natsMsg) + bufSize);
|
90
|
+
if (msg == NULL)
|
91
|
+
return nats_setDefaultError(NATS_NO_MEMORY);
|
92
|
+
|
93
|
+
// To be safe, we could 'memset' the message up to sizeof(natsMsg),
|
94
|
+
// but since we are explicitly initializing most of the fields, we save
|
95
|
+
// on that call, but we need to make sure what we initialize all fields!!!
|
96
|
+
|
97
|
+
// That being said, we memset the 'gc' structure to protect us in case
|
98
|
+
// some fields are later added to this 'external' structure and we forget
|
99
|
+
// about updating this initialization code.
|
100
|
+
memset(&(msg->gc), 0, sizeof(natsGCItem));
|
101
|
+
|
102
|
+
msg->sub = NULL;
|
103
|
+
msg->next = NULL;
|
104
|
+
|
105
|
+
ptr = (char*) (((char*) &(msg->next)) + sizeof(msg->next));
|
106
|
+
|
107
|
+
msg->subject = (const char*) ptr;
|
108
|
+
memcpy(ptr, subject, subjLen);
|
109
|
+
ptr += subjLen;
|
110
|
+
*(ptr++) = '\0';
|
111
|
+
|
112
|
+
msg->reply = (const char*) ptr;
|
113
|
+
if (replyLen > 0)
|
114
|
+
{
|
115
|
+
memcpy(ptr, reply, replyLen);
|
116
|
+
ptr += replyLen;
|
117
|
+
}
|
118
|
+
*(ptr++) = '\0';
|
119
|
+
|
120
|
+
msg->data = (const char*) ptr;
|
121
|
+
msg->dataLen = bufLen;
|
122
|
+
memcpy(ptr, buf, bufLen);
|
123
|
+
ptr += bufLen;
|
124
|
+
*(ptr) = '\0';
|
125
|
+
|
126
|
+
// Setting the callback will trigger garbage collection when
|
127
|
+
// natsMsg_Destroy() is invoked.
|
128
|
+
msg->gc.freeCb = natsMsg_free;
|
129
|
+
|
130
|
+
*newMsg = msg;
|
131
|
+
|
132
|
+
return NATS_OK;
|
133
|
+
}
|
134
|
+
|
135
|
+
natsStatus
|
136
|
+
natsMsg_Create(natsMsg **newMsg, const char *subj, const char *reply,
|
137
|
+
const char *data, int dataLen)
|
138
|
+
{
|
139
|
+
natsStatus s = NATS_OK;
|
140
|
+
|
141
|
+
if ((subj == NULL)
|
142
|
+
|| (subj[0] == '\0')
|
143
|
+
|| ((reply != NULL) && (reply[0] == '\0')))
|
144
|
+
{
|
145
|
+
return nats_setDefaultError(NATS_INVALID_ARG);
|
146
|
+
}
|
147
|
+
|
148
|
+
s = natsMsg_create(newMsg,
|
149
|
+
subj, (int) strlen(subj),
|
150
|
+
reply, (reply == NULL ? 0 : (int) strlen(reply)),
|
151
|
+
data, dataLen);
|
152
|
+
|
153
|
+
return NATS_UPDATE_ERR_STACK(s);
|
154
|
+
}
|
155
|
+
|
@@ -0,0 +1,43 @@
|
|
1
|
+
// Copyright 2015-2016 Apcera Inc. All rights reserved.
|
2
|
+
|
3
|
+
#ifndef MSG_H_
|
4
|
+
#define MSG_H_
|
5
|
+
|
6
|
+
#include "status.h"
|
7
|
+
#include "gc.h"
|
8
|
+
|
9
|
+
struct __natsMsg;
|
10
|
+
|
11
|
+
struct __natsMsg
|
12
|
+
{
|
13
|
+
natsGCItem gc;
|
14
|
+
|
15
|
+
// The message is allocated as a single memory block that contains
|
16
|
+
// this structure and enough space for the payload. The msg payload
|
17
|
+
// starts after the 'next' pointer.
|
18
|
+
const char *subject;
|
19
|
+
const char *reply;
|
20
|
+
const char *data;
|
21
|
+
int dataLen;
|
22
|
+
|
23
|
+
// subscription (needed when delivery done by connection)
|
24
|
+
struct __natsSubscription *sub;
|
25
|
+
|
26
|
+
// Must be last field!
|
27
|
+
struct __natsMsg *next;
|
28
|
+
|
29
|
+
// Nothing after this: the message payload goes there.
|
30
|
+
|
31
|
+
};
|
32
|
+
|
33
|
+
natsStatus
|
34
|
+
natsMsg_create(natsMsg **newMsg,
|
35
|
+
const char *subject, int subjLen,
|
36
|
+
const char *reply, int replyLen,
|
37
|
+
const char *buf, int bufLen);
|
38
|
+
|
39
|
+
// This needs to follow the nats_FreeObjectCb prototype (see gc.h)
|
40
|
+
void
|
41
|
+
natsMsg_free(void *object);
|
42
|
+
|
43
|
+
#endif /* MSG_H_ */
|