agoo 2.5.5 → 2.5.6
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.
Potentially problematic release.
This version of agoo might be problematic. Click here for more details.
- checksums.yaml +4 -4
- data/CHANGELOG.md +10 -0
- data/README.md +1 -1
- data/ext/agoo/agoo.c +4 -3
- data/ext/agoo/atomic.h +120 -0
- data/ext/agoo/bind.c +52 -52
- data/ext/agoo/bind.h +13 -13
- data/ext/agoo/con.c +499 -481
- data/ext/agoo/con.h +47 -39
- data/ext/agoo/debug.c +42 -42
- data/ext/agoo/debug.h +1 -1
- data/ext/agoo/doc.c +17 -17
- data/ext/agoo/doc.h +12 -12
- data/ext/agoo/err.c +18 -18
- data/ext/agoo/err.h +27 -27
- data/ext/agoo/error_stream.c +9 -9
- data/ext/agoo/extconf.rb +3 -0
- data/ext/agoo/gqlintro.c +43 -43
- data/ext/agoo/gqlintro.h +1 -1
- data/ext/agoo/gqlvalue.c +131 -131
- data/ext/agoo/gqlvalue.h +32 -32
- data/ext/agoo/graphql.c +158 -158
- data/ext/agoo/graphql.h +34 -33
- data/ext/agoo/hook.c +15 -14
- data/ext/agoo/hook.h +18 -14
- data/ext/agoo/http.c +14 -14
- data/ext/agoo/http.h +4 -4
- data/ext/agoo/kinds.h +5 -5
- data/ext/agoo/log.c +232 -224
- data/ext/agoo/log.h +93 -93
- data/ext/agoo/method.h +17 -17
- data/ext/agoo/page.c +88 -86
- data/ext/agoo/page.h +21 -21
- data/ext/agoo/pub.c +36 -36
- data/ext/agoo/pub.h +23 -23
- data/ext/agoo/queue.c +37 -38
- data/ext/agoo/queue.h +20 -19
- data/ext/agoo/rack_logger.c +13 -13
- data/ext/agoo/ready.c +357 -0
- data/ext/agoo/ready.h +41 -0
- data/ext/agoo/req.c +11 -11
- data/ext/agoo/req.h +30 -31
- data/ext/agoo/request.c +46 -46
- data/ext/agoo/request.h +2 -2
- data/ext/agoo/res.c +40 -18
- data/ext/agoo/res.h +14 -14
- data/ext/agoo/response.c +6 -6
- data/ext/agoo/response.h +9 -9
- data/ext/agoo/rhook.c +3 -3
- data/ext/agoo/rhook.h +1 -1
- data/ext/agoo/rlog.c +47 -42
- data/ext/agoo/rlog.h +0 -1
- data/ext/agoo/rresponse.c +33 -33
- data/ext/agoo/rresponse.h +1 -1
- data/ext/agoo/rserver.c +184 -175
- data/ext/agoo/rserver.h +2 -2
- data/ext/agoo/rupgraded.c +41 -41
- data/ext/agoo/rupgraded.h +3 -3
- data/ext/agoo/sdl.c +80 -80
- data/ext/agoo/sdl.h +1 -1
- data/ext/agoo/seg.h +2 -2
- data/ext/agoo/server.c +143 -117
- data/ext/agoo/server.h +43 -42
- data/ext/agoo/sse.c +7 -7
- data/ext/agoo/sse.h +4 -4
- data/ext/agoo/subject.c +5 -5
- data/ext/agoo/subject.h +6 -6
- data/ext/agoo/text.c +21 -21
- data/ext/agoo/text.h +14 -13
- data/ext/agoo/upgraded.c +41 -40
- data/ext/agoo/upgraded.h +41 -40
- data/ext/agoo/websocket.c +42 -42
- data/ext/agoo/websocket.h +16 -16
- data/lib/agoo/version.rb +1 -1
- data/test/static_test.rb +2 -0
- metadata +5 -5
- data/ext/agoo/log_queue.h +0 -30
- data/ext/agoo/sub.c +0 -111
- data/ext/agoo/sub.h +0 -36
data/ext/agoo/websocket.c
CHANGED
@@ -24,13 +24,13 @@ static const char ws_accept[] = "Sec-WebSocket-Accept: ";
|
|
24
24
|
|
25
25
|
//static const uint8_t close_msg[] = "\x88\x02\x03\xE8";
|
26
26
|
|
27
|
-
|
28
|
-
|
27
|
+
agooText
|
28
|
+
agoo_ws_add_headers(agooReq req, agooText t) {
|
29
29
|
int klen = 0;
|
30
30
|
const char *key;
|
31
31
|
|
32
|
-
t =
|
33
|
-
if (NULL != (key =
|
32
|
+
t = agoo_text_append(t, up_con, sizeof(up_con) - 1);
|
33
|
+
if (NULL != (key = agoo_con_header_value(req->header.start, req->header.len, "Sec-WebSocket-Key", &klen)) &&
|
34
34
|
klen + sizeof(ws_magic) < MAX_KEY_LEN) {
|
35
35
|
char buf[MAX_KEY_LEN];
|
36
36
|
unsigned char sha[32];
|
@@ -41,23 +41,23 @@ ws_add_headers(Req req, Text t) {
|
|
41
41
|
sha1((unsigned char*)buf, len, sha);
|
42
42
|
len = b64_to(sha, SHA1_DIGEST_SIZE, buf);
|
43
43
|
|
44
|
-
t =
|
45
|
-
t =
|
46
|
-
t =
|
44
|
+
t = agoo_text_append(t, ws_accept, sizeof(ws_accept) - 1);
|
45
|
+
t = agoo_text_append(t, buf, len);
|
46
|
+
t = agoo_text_append(t, "\r\n", 2);
|
47
47
|
}
|
48
|
-
if (NULL != (key =
|
49
|
-
t =
|
50
|
-
t =
|
51
|
-
t =
|
48
|
+
if (NULL != (key = agoo_con_header_value(req->header.start, req->header.len, "Sec-WebSocket-Protocol", &klen))) {
|
49
|
+
t = agoo_text_append(t, ws_protocol, sizeof(ws_protocol) - 1);
|
50
|
+
t = agoo_text_append(t, key, klen);
|
51
|
+
t = agoo_text_append(t, "\r\n", 2);
|
52
52
|
}
|
53
53
|
return t;
|
54
54
|
}
|
55
55
|
|
56
|
-
|
57
|
-
|
56
|
+
agooText
|
57
|
+
agoo_ws_expand(agooText t) {
|
58
58
|
uint8_t buf[16];
|
59
59
|
uint8_t *b = buf;
|
60
|
-
uint8_t opcode = t->bin ?
|
60
|
+
uint8_t opcode = t->bin ? AGOO_WS_OP_BIN : AGOO_WS_OP_TEXT;
|
61
61
|
|
62
62
|
*b++ = 0x80 | (uint8_t)opcode;
|
63
63
|
// send unmasked
|
@@ -75,11 +75,11 @@ ws_expand(Text t) {
|
|
75
75
|
*b++ = (uint8_t)((t->len >> i) & 0xFF);
|
76
76
|
}
|
77
77
|
}
|
78
|
-
return
|
78
|
+
return agoo_text_prepend(t, (const char*)buf, (int)(b - buf));
|
79
79
|
}
|
80
80
|
|
81
81
|
size_t
|
82
|
-
|
82
|
+
agoo_ws_decode(char *buf, size_t mlen) {
|
83
83
|
uint8_t *b = (uint8_t*)buf;
|
84
84
|
bool is_masked;
|
85
85
|
uint8_t *payload;
|
@@ -125,13 +125,13 @@ ws_decode(char *buf, size_t mlen) {
|
|
125
125
|
|
126
126
|
// if -1 then err, 0 not ready yet, positive is completed length
|
127
127
|
long
|
128
|
-
|
128
|
+
agoo_ws_calc_len(agooCon c, uint8_t *buf, size_t cnt) {
|
129
129
|
uint8_t *b = buf;
|
130
130
|
bool is_masked;
|
131
131
|
uint64_t plen;
|
132
132
|
|
133
133
|
if (0 == (0x80 & *b)) {
|
134
|
-
|
134
|
+
agoo_log_cat(&agoo_error_cat, "FIN must be 1. Websocket continuation not implemented on connection %llu.", (unsigned long long)c->id);
|
135
135
|
return -1;
|
136
136
|
}
|
137
137
|
b++;
|
@@ -165,17 +165,17 @@ ws_calc_len(Con c, uint8_t *buf, size_t cnt) {
|
|
165
165
|
|
166
166
|
// Return true on error otherwise false.
|
167
167
|
bool
|
168
|
-
|
168
|
+
agoo_ws_create_req(agooCon c, long mlen) {
|
169
169
|
uint8_t op = 0x0F & *c->buf;
|
170
170
|
|
171
|
-
if (NULL == (c->req =
|
172
|
-
|
171
|
+
if (NULL == (c->req = agoo_req_create(mlen))) {
|
172
|
+
agoo_log_cat(&agoo_error_cat, "Out of memory attempting to allocate request.");
|
173
173
|
return true;
|
174
174
|
}
|
175
|
-
if (NULL == c->up ||
|
175
|
+
if (NULL == c->up || agoo_server.ctx_nil_value == c->up->ctx) {
|
176
176
|
return true;
|
177
177
|
}
|
178
|
-
memset(c->req, 0, sizeof(struct
|
178
|
+
memset(c->req, 0, sizeof(struct _agooReq));
|
179
179
|
if ((long)c->bcnt <= mlen) {
|
180
180
|
memcpy(c->req->msg, c->buf, c->bcnt);
|
181
181
|
if ((long)c->bcnt < mlen) {
|
@@ -186,35 +186,35 @@ ws_create_req(Con c, long mlen) {
|
|
186
186
|
}
|
187
187
|
c->req->msg[mlen] = '\0';
|
188
188
|
c->req->mlen = mlen;
|
189
|
-
c->req->method = (
|
190
|
-
c->req->upgrade =
|
189
|
+
c->req->method = (AGOO_WS_OP_BIN == op) ? AGOO_ON_BIN : AGOO_ON_MSG;
|
190
|
+
c->req->upgrade = AGOO_UP_NONE;
|
191
191
|
c->req->up = c->up;
|
192
192
|
c->req->res = NULL;
|
193
193
|
if (c->up->on_msg) {
|
194
|
-
c->req->hook =
|
194
|
+
c->req->hook = agoo_hook_create(AGOO_NONE, NULL, c->up->ctx, PUSH_HOOK, &agoo_server.eval_queue);
|
195
195
|
}
|
196
196
|
return false;
|
197
197
|
}
|
198
198
|
|
199
199
|
void
|
200
|
-
|
201
|
-
if (NULL != c->up &&
|
202
|
-
|
200
|
+
agoo_ws_req_close(agooCon c) {
|
201
|
+
if (NULL != c->up && agoo_server.ctx_nil_value != c->up->ctx && c->up->on_close) {
|
202
|
+
agooReq req = agoo_req_create(0);
|
203
203
|
|
204
204
|
req->up = c->up;
|
205
|
-
req->method =
|
206
|
-
req->hook =
|
205
|
+
req->method = AGOO_ON_CLOSE;
|
206
|
+
req->hook = agoo_hook_create(AGOO_NONE, NULL, c->up->ctx, PUSH_HOOK, &agoo_server.eval_queue);
|
207
207
|
atomic_fetch_add(&c->up->ref_cnt, 1);
|
208
|
-
|
208
|
+
agoo_queue_push(&agoo_server.eval_queue, (void*)req);
|
209
209
|
}
|
210
210
|
}
|
211
211
|
|
212
212
|
void
|
213
|
-
|
214
|
-
|
213
|
+
agoo_ws_ping(agooCon c) {
|
214
|
+
agooRes res;
|
215
215
|
|
216
|
-
if (NULL == (res =
|
217
|
-
|
216
|
+
if (NULL == (res = agoo_res_create(c))) {
|
217
|
+
agoo_log_cat(&agoo_error_cat, "Memory allocation of response failed on connection %llu.", (unsigned long long)c->id);
|
218
218
|
} else {
|
219
219
|
if (NULL == c->res_tail) {
|
220
220
|
c->res_head = res;
|
@@ -223,17 +223,17 @@ ws_ping(Con c) {
|
|
223
223
|
}
|
224
224
|
c->res_tail = res;
|
225
225
|
res->close = false;
|
226
|
-
res->con_kind =
|
226
|
+
res->con_kind = AGOO_CON_WS;
|
227
227
|
res->ping = true;
|
228
228
|
}
|
229
229
|
}
|
230
230
|
|
231
231
|
void
|
232
|
-
|
233
|
-
|
232
|
+
agoo_ws_pong(agooCon c) {
|
233
|
+
agooRes res;
|
234
234
|
|
235
|
-
if (NULL == (res =
|
236
|
-
|
235
|
+
if (NULL == (res = agoo_res_create(c))) {
|
236
|
+
agoo_log_cat(&agoo_error_cat, "Memory allocation of response failed on connection %llu.", (unsigned long long)c->id);
|
237
237
|
} else {
|
238
238
|
if (NULL == c->res_tail) {
|
239
239
|
c->res_head = res;
|
@@ -242,7 +242,7 @@ ws_pong(Con c) {
|
|
242
242
|
}
|
243
243
|
c->res_tail = res;
|
244
244
|
res->close = false;
|
245
|
-
res->con_kind =
|
245
|
+
res->con_kind = AGOO_CON_WS;
|
246
246
|
res->pong = true;
|
247
247
|
}
|
248
248
|
}
|
data/ext/agoo/websocket.h
CHANGED
@@ -3,25 +3,25 @@
|
|
3
3
|
#ifndef AGOO_WEBSOCKET_H
|
4
4
|
#define AGOO_WEBSOCKET_H
|
5
5
|
|
6
|
-
#define
|
7
|
-
#define
|
8
|
-
#define
|
9
|
-
#define
|
10
|
-
#define
|
11
|
-
#define
|
6
|
+
#define AGOO_WS_OP_CONT 0x00
|
7
|
+
#define AGOO_WS_OP_TEXT 0x01
|
8
|
+
#define AGOO_WS_OP_BIN 0x02
|
9
|
+
#define AGOO_WS_OP_CLOSE 0x08
|
10
|
+
#define AGOO_WS_OP_PING 0x09
|
11
|
+
#define AGOO_WS_OP_PONG 0x0A
|
12
12
|
|
13
|
-
struct
|
14
|
-
struct
|
13
|
+
struct _agooReq;
|
14
|
+
struct _agooText;
|
15
15
|
|
16
|
-
extern struct
|
17
|
-
extern
|
18
|
-
extern size_t
|
16
|
+
extern struct _agooText* agoo_ws_add_headers(struct _agooReq *req, struct _agooText *t);
|
17
|
+
extern struct _agooText* agoo_ws_expand(agooText t);
|
18
|
+
extern size_t agoo_ws_decode(char *buf, size_t mlen);
|
19
19
|
|
20
|
-
extern long
|
21
|
-
extern bool
|
22
|
-
extern void
|
20
|
+
extern long agoo_ws_calc_len(agooCon c, uint8_t *buf, size_t cnt);
|
21
|
+
extern bool agoo_ws_create_req(agooCon c, long mlen);
|
22
|
+
extern void agoo_ws_req_close(agooCon c);
|
23
23
|
|
24
|
-
extern void
|
25
|
-
extern void
|
24
|
+
extern void agoo_ws_ping(agooCon c);
|
25
|
+
extern void agoo_ws_pong(agooCon c);
|
26
26
|
|
27
27
|
#endif // AGOO_WEBSOCKET_H
|
data/lib/agoo/version.rb
CHANGED
data/test/static_test.rb
CHANGED
@@ -34,10 +34,12 @@ class StaticTest < Minitest::Test
|
|
34
34
|
Agoo::Server.add_mime('odd', 'text/odd')
|
35
35
|
Agoo::Server.start()
|
36
36
|
fetch_index_test
|
37
|
+
=begin
|
37
38
|
mime_test
|
38
39
|
fetch_auto_index_test
|
39
40
|
fetch_nested_test
|
40
41
|
fetch_not_found_test
|
42
|
+
=end
|
41
43
|
ensure
|
42
44
|
Agoo::shutdown
|
43
45
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: agoo
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 2.5.
|
4
|
+
version: 2.5.6
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Peter Ohler
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2018-11-
|
11
|
+
date: 2018-11-26 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: oj
|
@@ -46,6 +46,7 @@ files:
|
|
46
46
|
- README.md
|
47
47
|
- bin/agoo
|
48
48
|
- ext/agoo/agoo.c
|
49
|
+
- ext/agoo/atomic.h
|
49
50
|
- ext/agoo/base64.c
|
50
51
|
- ext/agoo/base64.h
|
51
52
|
- ext/agoo/bind.c
|
@@ -76,7 +77,6 @@ files:
|
|
76
77
|
- ext/agoo/kinds.h
|
77
78
|
- ext/agoo/log.c
|
78
79
|
- ext/agoo/log.h
|
79
|
-
- ext/agoo/log_queue.h
|
80
80
|
- ext/agoo/method.h
|
81
81
|
- ext/agoo/page.c
|
82
82
|
- ext/agoo/page.h
|
@@ -86,6 +86,8 @@ files:
|
|
86
86
|
- ext/agoo/queue.h
|
87
87
|
- ext/agoo/rack_logger.c
|
88
88
|
- ext/agoo/rack_logger.h
|
89
|
+
- ext/agoo/ready.c
|
90
|
+
- ext/agoo/ready.h
|
89
91
|
- ext/agoo/req.c
|
90
92
|
- ext/agoo/req.h
|
91
93
|
- ext/agoo/request.c
|
@@ -113,8 +115,6 @@ files:
|
|
113
115
|
- ext/agoo/sha1.h
|
114
116
|
- ext/agoo/sse.c
|
115
117
|
- ext/agoo/sse.h
|
116
|
-
- ext/agoo/sub.c
|
117
|
-
- ext/agoo/sub.h
|
118
118
|
- ext/agoo/subject.c
|
119
119
|
- ext/agoo/subject.h
|
120
120
|
- ext/agoo/text.c
|
data/ext/agoo/log_queue.h
DELETED
@@ -1,30 +0,0 @@
|
|
1
|
-
// Copyright 2018 by Peter Ohler, All Rights Reserved
|
2
|
-
|
3
|
-
#ifndef AGOO_LOG_QUEUE_H
|
4
|
-
#define AGOO_LOG_QUEUE_H
|
5
|
-
|
6
|
-
#include <stdatomic.h>
|
7
|
-
#include <stdbool.h>
|
8
|
-
|
9
|
-
#include "val.h"
|
10
|
-
|
11
|
-
typedef struct _LogQueue {
|
12
|
-
opoMsg *q;
|
13
|
-
opoMsg *end;
|
14
|
-
_Atomic(opoMsg*) head;
|
15
|
-
_Atomic(opoMsg*) tail;
|
16
|
-
atomic_flag pop_lock; // set to true when ppo in progress
|
17
|
-
atomic_int wait_state;
|
18
|
-
int rsock;
|
19
|
-
int wsock;
|
20
|
-
} *LogQueue;
|
21
|
-
|
22
|
-
extern void queue_init(Queue q, size_t qsize);
|
23
|
-
|
24
|
-
extern void queue_cleanup(Queue q);
|
25
|
-
extern void queue_push(Queue q, opoMsg item);
|
26
|
-
extern opoMsg queue_pop(Queue q, double timeout);
|
27
|
-
extern bool queue_empty(Queue q);
|
28
|
-
extern int queue_count(Queue q);
|
29
|
-
|
30
|
-
#endif /* AGOO_LOG_QUEUE_H */
|
data/ext/agoo/sub.c
DELETED
@@ -1,111 +0,0 @@
|
|
1
|
-
// Copyright (c) 2018, Peter Ohler, All rights reserved.
|
2
|
-
|
3
|
-
#include <stdlib.h>
|
4
|
-
#include <string.h>
|
5
|
-
|
6
|
-
#include "sub.h"
|
7
|
-
|
8
|
-
Sub
|
9
|
-
sub_new(uint64_t cid, uint64_t id, const char *subject, size_t slen) {
|
10
|
-
Sub s = (Sub)malloc(sizeof(struct _Sub) - 8 + slen + 1);
|
11
|
-
|
12
|
-
if (NULL != s) {
|
13
|
-
s->cid = cid;
|
14
|
-
s->id = id;
|
15
|
-
strncpy(s->subject, subject, slen);
|
16
|
-
s->subject[slen] = '\0';
|
17
|
-
}
|
18
|
-
return s;
|
19
|
-
}
|
20
|
-
|
21
|
-
bool
|
22
|
-
sub_match(Sub s, const char *subject, size_t slen) {
|
23
|
-
const char *pat = s->subject;
|
24
|
-
const char *end = subject + slen;
|
25
|
-
|
26
|
-
for (; '\0' != *pat && subject < end; subject++) {
|
27
|
-
if (*subject == *pat) {
|
28
|
-
subject++;
|
29
|
-
} else if ('*' == *pat) {
|
30
|
-
for (; subject < end && '.' != *subject; subject++) {
|
31
|
-
}
|
32
|
-
} else if ('>' == *pat) {
|
33
|
-
return true;
|
34
|
-
} else {
|
35
|
-
break;
|
36
|
-
}
|
37
|
-
}
|
38
|
-
return '\0' == *pat && subject == end;
|
39
|
-
}
|
40
|
-
|
41
|
-
void
|
42
|
-
sub_init(SubCache sc) {
|
43
|
-
memset(sc, 0, sizeof(struct _SubCache));
|
44
|
-
}
|
45
|
-
|
46
|
-
void
|
47
|
-
sub_cleanup(SubCache sc) {
|
48
|
-
Sub s;
|
49
|
-
Sub head;
|
50
|
-
Sub *bucket;
|
51
|
-
int i;
|
52
|
-
|
53
|
-
for (i = 0, bucket = sc->buckets; i < SUB_BUCKET_SIZE; i++, bucket++) {
|
54
|
-
head = *bucket;
|
55
|
-
while (NULL != head) {
|
56
|
-
s = head;
|
57
|
-
head = head->next;
|
58
|
-
free(s);
|
59
|
-
}
|
60
|
-
}
|
61
|
-
}
|
62
|
-
|
63
|
-
static uint64_t
|
64
|
-
calc_hash(uint64_t cid, uint64_t sid) {
|
65
|
-
return (SUB_BUCKET_MASK & (cid ^ sid));
|
66
|
-
}
|
67
|
-
|
68
|
-
void
|
69
|
-
sub_add(SubCache sc, Sub s) {
|
70
|
-
Sub *bucket = sc->buckets + calc_hash(s->cid, s->id);
|
71
|
-
|
72
|
-
s->next = *bucket;
|
73
|
-
*bucket = s;
|
74
|
-
}
|
75
|
-
|
76
|
-
Sub
|
77
|
-
sub_get(SubCache sc, uint64_t cid, uint64_t sid) {
|
78
|
-
Sub s = *(sc->buckets + calc_hash(cid, sid));
|
79
|
-
|
80
|
-
for (; NULL != s; s = s->next) {
|
81
|
-
if (s->cid == cid && s->id == sid) {
|
82
|
-
return s;
|
83
|
-
}
|
84
|
-
}
|
85
|
-
return NULL;
|
86
|
-
}
|
87
|
-
|
88
|
-
void
|
89
|
-
sub_del(SubCache sc, uint64_t cid, uint64_t sid) {
|
90
|
-
Sub *bucket = sc->buckets + calc_hash(cid, sid);
|
91
|
-
|
92
|
-
if (NULL != *bucket) {
|
93
|
-
Sub s = *bucket;
|
94
|
-
|
95
|
-
if (s->cid == cid && s->id == sid) {
|
96
|
-
*bucket = s->next;
|
97
|
-
} else {
|
98
|
-
Sub prev = s;
|
99
|
-
|
100
|
-
for (s = s->next; NULL != s; s = s->next) {
|
101
|
-
if (s->cid == cid && s->id == sid) {
|
102
|
-
prev->next = s->next;
|
103
|
-
free(s);
|
104
|
-
break;
|
105
|
-
}
|
106
|
-
prev = s;
|
107
|
-
}
|
108
|
-
}
|
109
|
-
}
|
110
|
-
}
|
111
|
-
|
data/ext/agoo/sub.h
DELETED
@@ -1,36 +0,0 @@
|
|
1
|
-
// Copyright (c) 2018, Peter Ohler, All rights reserved.
|
2
|
-
|
3
|
-
#ifndef AGOO_SUB_H
|
4
|
-
#define AGOO_SUB_H
|
5
|
-
|
6
|
-
#include <stdbool.h>
|
7
|
-
#include <stdint.h>
|
8
|
-
|
9
|
-
#define SUB_BUCKET_SIZE 1024
|
10
|
-
#define SUB_BUCKET_MASK 1023
|
11
|
-
|
12
|
-
struct _Con;
|
13
|
-
|
14
|
-
typedef struct _Sub {
|
15
|
-
struct _Sub *next;
|
16
|
-
uint64_t cid;
|
17
|
-
struct _Con *con;
|
18
|
-
uint64_t id;
|
19
|
-
uint64_t key; // hash key
|
20
|
-
char subject[8];
|
21
|
-
} *Sub;
|
22
|
-
|
23
|
-
typedef struct _SubCache {
|
24
|
-
Sub buckets[SUB_BUCKET_SIZE];
|
25
|
-
} *SubCache;
|
26
|
-
|
27
|
-
extern void sub_init(SubCache sc);
|
28
|
-
extern void sub_cleanup(SubCache sc);
|
29
|
-
|
30
|
-
extern Sub sub_new(uint64_t cid, uint64_t id, const char *subject, size_t slen);
|
31
|
-
extern bool sub_match(Sub s, const char *subject, size_t slen);
|
32
|
-
extern void sub_add(SubCache sc, Sub s);
|
33
|
-
extern Sub sub_get(SubCache sc, uint64_t cid, uint64_t sid);
|
34
|
-
extern void sub_del(SubCache sc, uint64_t cid, uint64_t sid);
|
35
|
-
|
36
|
-
#endif // AGOO_SUB_H
|