ffi-nats-core 0.3.0 → 0.3.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- 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_ */
|