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.

Files changed (79) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +10 -0
  3. data/README.md +1 -1
  4. data/ext/agoo/agoo.c +4 -3
  5. data/ext/agoo/atomic.h +120 -0
  6. data/ext/agoo/bind.c +52 -52
  7. data/ext/agoo/bind.h +13 -13
  8. data/ext/agoo/con.c +499 -481
  9. data/ext/agoo/con.h +47 -39
  10. data/ext/agoo/debug.c +42 -42
  11. data/ext/agoo/debug.h +1 -1
  12. data/ext/agoo/doc.c +17 -17
  13. data/ext/agoo/doc.h +12 -12
  14. data/ext/agoo/err.c +18 -18
  15. data/ext/agoo/err.h +27 -27
  16. data/ext/agoo/error_stream.c +9 -9
  17. data/ext/agoo/extconf.rb +3 -0
  18. data/ext/agoo/gqlintro.c +43 -43
  19. data/ext/agoo/gqlintro.h +1 -1
  20. data/ext/agoo/gqlvalue.c +131 -131
  21. data/ext/agoo/gqlvalue.h +32 -32
  22. data/ext/agoo/graphql.c +158 -158
  23. data/ext/agoo/graphql.h +34 -33
  24. data/ext/agoo/hook.c +15 -14
  25. data/ext/agoo/hook.h +18 -14
  26. data/ext/agoo/http.c +14 -14
  27. data/ext/agoo/http.h +4 -4
  28. data/ext/agoo/kinds.h +5 -5
  29. data/ext/agoo/log.c +232 -224
  30. data/ext/agoo/log.h +93 -93
  31. data/ext/agoo/method.h +17 -17
  32. data/ext/agoo/page.c +88 -86
  33. data/ext/agoo/page.h +21 -21
  34. data/ext/agoo/pub.c +36 -36
  35. data/ext/agoo/pub.h +23 -23
  36. data/ext/agoo/queue.c +37 -38
  37. data/ext/agoo/queue.h +20 -19
  38. data/ext/agoo/rack_logger.c +13 -13
  39. data/ext/agoo/ready.c +357 -0
  40. data/ext/agoo/ready.h +41 -0
  41. data/ext/agoo/req.c +11 -11
  42. data/ext/agoo/req.h +30 -31
  43. data/ext/agoo/request.c +46 -46
  44. data/ext/agoo/request.h +2 -2
  45. data/ext/agoo/res.c +40 -18
  46. data/ext/agoo/res.h +14 -14
  47. data/ext/agoo/response.c +6 -6
  48. data/ext/agoo/response.h +9 -9
  49. data/ext/agoo/rhook.c +3 -3
  50. data/ext/agoo/rhook.h +1 -1
  51. data/ext/agoo/rlog.c +47 -42
  52. data/ext/agoo/rlog.h +0 -1
  53. data/ext/agoo/rresponse.c +33 -33
  54. data/ext/agoo/rresponse.h +1 -1
  55. data/ext/agoo/rserver.c +184 -175
  56. data/ext/agoo/rserver.h +2 -2
  57. data/ext/agoo/rupgraded.c +41 -41
  58. data/ext/agoo/rupgraded.h +3 -3
  59. data/ext/agoo/sdl.c +80 -80
  60. data/ext/agoo/sdl.h +1 -1
  61. data/ext/agoo/seg.h +2 -2
  62. data/ext/agoo/server.c +143 -117
  63. data/ext/agoo/server.h +43 -42
  64. data/ext/agoo/sse.c +7 -7
  65. data/ext/agoo/sse.h +4 -4
  66. data/ext/agoo/subject.c +5 -5
  67. data/ext/agoo/subject.h +6 -6
  68. data/ext/agoo/text.c +21 -21
  69. data/ext/agoo/text.h +14 -13
  70. data/ext/agoo/upgraded.c +41 -40
  71. data/ext/agoo/upgraded.h +41 -40
  72. data/ext/agoo/websocket.c +42 -42
  73. data/ext/agoo/websocket.h +16 -16
  74. data/lib/agoo/version.rb +1 -1
  75. data/test/static_test.rb +2 -0
  76. metadata +5 -5
  77. data/ext/agoo/log_queue.h +0 -30
  78. data/ext/agoo/sub.c +0 -111
  79. data/ext/agoo/sub.h +0 -36
@@ -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
- Text
28
- ws_add_headers(Req req, Text t) {
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 = text_append(t, up_con, sizeof(up_con) - 1);
33
- if (NULL != (key = con_header_value(req->header.start, req->header.len, "Sec-WebSocket-Key", &klen)) &&
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 = text_append(t, ws_accept, sizeof(ws_accept) - 1);
45
- t = text_append(t, buf, len);
46
- t = text_append(t, "\r\n", 2);
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 = con_header_value(req->header.start, req->header.len, "Sec-WebSocket-Protocol", &klen))) {
49
- t = text_append(t, ws_protocol, sizeof(ws_protocol) - 1);
50
- t = text_append(t, key, klen);
51
- t = text_append(t, "\r\n", 2);
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
- Text
57
- ws_expand(Text t) {
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 ? WS_OP_BIN : WS_OP_TEXT;
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 text_prepend(t, (const char*)buf, (int)(b - buf));
78
+ return agoo_text_prepend(t, (const char*)buf, (int)(b - buf));
79
79
  }
80
80
 
81
81
  size_t
82
- ws_decode(char *buf, size_t mlen) {
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
- ws_calc_len(Con c, uint8_t *buf, size_t cnt) {
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
- log_cat(&error_cat, "FIN must be 1. Websocket continuation not implemented on connection %llu.", (unsigned long long)c->id);
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
- ws_create_req(Con c, long mlen) {
168
+ agoo_ws_create_req(agooCon c, long mlen) {
169
169
  uint8_t op = 0x0F & *c->buf;
170
170
 
171
- if (NULL == (c->req = req_create(mlen))) {
172
- log_cat(&error_cat, "Out of memory attempting to allocate request.");
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 || the_server.ctx_nil_value == c->up->ctx) {
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 _Req));
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 = (WS_OP_BIN == op) ? ON_BIN : ON_MSG;
190
- c->req->upgrade = UP_NONE;
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 = hook_create(NONE, NULL, c->up->ctx, PUSH_HOOK, &the_server.eval_queue);
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
- ws_req_close(Con c) {
201
- if (NULL != c->up && the_server.ctx_nil_value != c->up->ctx && c->up->on_close) {
202
- Req req = req_create(0);
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 = ON_CLOSE;
206
- req->hook = hook_create(NONE, NULL, c->up->ctx, PUSH_HOOK, &the_server.eval_queue);
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
- queue_push(&the_server.eval_queue, (void*)req);
208
+ agoo_queue_push(&agoo_server.eval_queue, (void*)req);
209
209
  }
210
210
  }
211
211
 
212
212
  void
213
- ws_ping(Con c) {
214
- Res res;
213
+ agoo_ws_ping(agooCon c) {
214
+ agooRes res;
215
215
 
216
- if (NULL == (res = res_create(c))) {
217
- log_cat(&error_cat, "Memory allocation of response failed on connection %llu.", (unsigned long long)c->id);
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 = CON_WS;
226
+ res->con_kind = AGOO_CON_WS;
227
227
  res->ping = true;
228
228
  }
229
229
  }
230
230
 
231
231
  void
232
- ws_pong(Con c) {
233
- Res res;
232
+ agoo_ws_pong(agooCon c) {
233
+ agooRes res;
234
234
 
235
- if (NULL == (res = res_create(c))) {
236
- log_cat(&error_cat, "Memory allocation of response failed on connection %llu.", (unsigned long long)c->id);
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 = CON_WS;
245
+ res->con_kind = AGOO_CON_WS;
246
246
  res->pong = true;
247
247
  }
248
248
  }
@@ -3,25 +3,25 @@
3
3
  #ifndef AGOO_WEBSOCKET_H
4
4
  #define AGOO_WEBSOCKET_H
5
5
 
6
- #define WS_OP_CONT 0x00
7
- #define WS_OP_TEXT 0x01
8
- #define WS_OP_BIN 0x02
9
- #define WS_OP_CLOSE 0x08
10
- #define WS_OP_PING 0x09
11
- #define WS_OP_PONG 0x0A
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 _Req;
14
- struct _Text;
13
+ struct _agooReq;
14
+ struct _agooText;
15
15
 
16
- extern struct _Text* ws_add_headers(struct _Req *req, struct _Text *t);
17
- extern Text ws_expand(Text t);
18
- extern size_t ws_decode(char *buf, size_t mlen);
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 ws_calc_len(Con c, uint8_t *buf, size_t cnt);
21
- extern bool ws_create_req(Con c, long mlen);
22
- extern void ws_req_close(Con c);
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 ws_ping(Con c);
25
- extern void ws_pong(Con c);
24
+ extern void agoo_ws_ping(agooCon c);
25
+ extern void agoo_ws_pong(agooCon c);
26
26
 
27
27
  #endif // AGOO_WEBSOCKET_H
@@ -1,5 +1,5 @@
1
1
 
2
2
  module Agoo
3
3
  # Agoo version.
4
- VERSION = '2.5.5'
4
+ VERSION = '2.5.6'
5
5
  end
@@ -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.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-12 00:00:00.000000000 Z
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
@@ -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 */
@@ -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
-
@@ -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