agoo 1.2.2 → 2.0.0
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/README.md +11 -9
- data/ext/agoo/agoo.c +45 -0
- data/ext/agoo/base64.c +107 -0
- data/ext/agoo/base64.h +15 -0
- data/ext/agoo/ccache.c +301 -0
- data/ext/agoo/ccache.h +53 -0
- data/ext/agoo/con.c +522 -82
- data/ext/agoo/con.h +7 -5
- data/ext/agoo/debug.c +121 -7
- data/ext/agoo/debug.h +11 -6
- data/ext/agoo/error_stream.c +5 -6
- data/ext/agoo/error_stream.h +1 -1
- data/ext/agoo/extconf.rb +2 -1
- data/ext/agoo/hook.c +4 -4
- data/ext/agoo/hook.h +1 -0
- data/ext/agoo/http.c +2 -2
- data/ext/agoo/http.h +2 -0
- data/ext/agoo/log.c +604 -219
- data/ext/agoo/log.h +20 -7
- data/ext/agoo/page.c +20 -23
- data/ext/agoo/page.h +2 -0
- data/ext/agoo/pub.c +111 -0
- data/ext/agoo/pub.h +40 -0
- data/ext/agoo/queue.c +2 -2
- data/ext/agoo/rack_logger.c +15 -71
- data/ext/agoo/rack_logger.h +1 -1
- data/ext/agoo/request.c +96 -21
- data/ext/agoo/request.h +23 -12
- data/ext/agoo/res.c +5 -2
- data/ext/agoo/res.h +4 -0
- data/ext/agoo/response.c +13 -12
- data/ext/agoo/response.h +1 -2
- data/ext/agoo/server.c +290 -428
- data/ext/agoo/server.h +10 -10
- data/ext/agoo/sha1.c +148 -0
- data/ext/agoo/sha1.h +10 -0
- data/ext/agoo/sse.c +26 -0
- data/ext/agoo/sse.h +12 -0
- data/ext/agoo/sub.c +111 -0
- data/ext/agoo/sub.h +36 -0
- data/ext/agoo/subscription.c +54 -0
- data/ext/agoo/subscription.h +18 -0
- data/ext/agoo/text.c +26 -4
- data/ext/agoo/text.h +2 -0
- data/ext/agoo/types.h +13 -0
- data/ext/agoo/upgraded.c +148 -0
- data/ext/agoo/upgraded.h +13 -0
- data/ext/agoo/websocket.c +248 -0
- data/ext/agoo/websocket.h +27 -0
- data/lib/agoo/version.rb +1 -1
- data/lib/rack/handler/agoo.rb +13 -6
- data/test/base_handler_test.rb +24 -22
- data/test/log_test.rb +146 -199
- data/test/rack_handler_test.rb +19 -20
- data/test/static_test.rb +30 -28
- metadata +23 -7
- data/test/rrr/test.rb +0 -26
- data/test/tests.rb +0 -8
    
        data/ext/agoo/log.h
    CHANGED
    
    | @@ -49,7 +49,6 @@ typedef struct _Log	*Log; | |
| 49 49 |  | 
| 50 50 | 
             
            typedef struct _LogCat {
         | 
| 51 51 | 
             
                struct _LogCat	*next;
         | 
| 52 | 
            -
                Log			log;
         | 
| 53 52 | 
             
                char		label[32];
         | 
| 54 53 | 
             
                Color		color;
         | 
| 55 54 | 
             
                int			level;
         | 
| @@ -91,13 +90,27 @@ struct _Log { | |
| 91 90 | 
             
                int			wsock;
         | 
| 92 91 | 
             
            };
         | 
| 93 92 |  | 
| 94 | 
            -
            extern  | 
| 95 | 
            -
            extern  | 
| 96 | 
            -
            extern  | 
| 93 | 
            +
            extern struct _Log	the_log;
         | 
| 94 | 
            +
            extern struct _LogCat	fatal_cat;
         | 
| 95 | 
            +
            extern struct _LogCat	error_cat;
         | 
| 96 | 
            +
            extern struct _LogCat	warn_cat;
         | 
| 97 | 
            +
            extern struct _LogCat	info_cat;
         | 
| 98 | 
            +
            extern struct _LogCat	debug_cat;
         | 
| 99 | 
            +
            extern struct _LogCat	con_cat;
         | 
| 100 | 
            +
            extern struct _LogCat	req_cat;
         | 
| 101 | 
            +
            extern struct _LogCat	resp_cat;
         | 
| 102 | 
            +
            extern struct _LogCat	eval_cat;
         | 
| 103 | 
            +
            extern struct _LogCat	push_cat;
         | 
| 97 104 |  | 
| 98 | 
            -
            extern void	 | 
| 99 | 
            -
             | 
| 100 | 
            -
            extern  | 
| 105 | 
            +
            extern void	log_init(VALUE mod);
         | 
| 106 | 
            +
             | 
| 107 | 
            +
            extern void	log_close();
         | 
| 108 | 
            +
            extern bool	log_flush(double timeout);
         | 
| 109 | 
            +
            extern void	log_rotate();
         | 
| 110 | 
            +
             | 
| 111 | 
            +
            extern void	log_cat_reg(LogCat cat, const char *label, LogLevel level, const char *color, bool on);
         | 
| 112 | 
            +
            extern void	log_cat_on(const char *label, bool on);
         | 
| 113 | 
            +
            extern LogCat	log_cat_find(const char *label);
         | 
| 101 114 |  | 
| 102 115 | 
             
            // Function to call to make a log entry.
         | 
| 103 116 | 
             
            extern void	log_cat(LogCat cat, const char *fmt, ...);
         | 
    
        data/ext/agoo/page.c
    CHANGED
    
    | @@ -159,7 +159,7 @@ mime_set(Cache cache, const char *key, const char *value) { | |
| 159 159 | 
             
            	    ((0 <= len && len <= MAX_KEY_UNIQ) || 0 == strcmp(s->key, key))) {
         | 
| 160 160 | 
             
            	    if (h == (int64_t)s->hash && len == s->klen &&
         | 
| 161 161 | 
             
            		((0 <= len && len <= MAX_KEY_UNIQ) || 0 == strcmp(s->key, key))) {
         | 
| 162 | 
            -
            		DEBUG_FREE(mem_mime_slot)
         | 
| 162 | 
            +
            		DEBUG_FREE(mem_mime_slot, s->value)
         | 
| 163 163 | 
             
            		free(s->value);
         | 
| 164 164 | 
             
            		s->value = strdup(value);
         | 
| 165 165 | 
             
            		return;
         | 
| @@ -169,7 +169,7 @@ mime_set(Cache cache, const char *key, const char *value) { | |
| 169 169 | 
             
                if (NULL == (s = (MimeSlot)malloc(sizeof(struct _MimeSlot)))) {
         | 
| 170 170 | 
             
            	rb_raise(rb_eArgError, "out of memory adding %s", key);
         | 
| 171 171 | 
             
                }
         | 
| 172 | 
            -
                DEBUG_ALLOC(mem_mime_slot)
         | 
| 172 | 
            +
                DEBUG_ALLOC(mem_mime_slot, s)
         | 
| 173 173 | 
             
                s->hash = h;
         | 
| 174 174 | 
             
                s->klen = len;
         | 
| 175 175 | 
             
                if (NULL == key) {
         | 
| @@ -209,7 +209,7 @@ cache_set(Cache cache, const char *key, int klen, Page value) { | |
| 209 209 | 
             
                if (NULL == (s = (Slot)malloc(sizeof(struct _Slot)))) {
         | 
| 210 210 | 
             
            	return value;
         | 
| 211 211 | 
             
                }
         | 
| 212 | 
            -
                DEBUG_ALLOC(mem_page_slot)
         | 
| 212 | 
            +
                DEBUG_ALLOC(mem_page_slot, s)
         | 
| 213 213 | 
             
                s->hash = h;
         | 
| 214 214 | 
             
                s->klen = len;
         | 
| 215 215 | 
             
                if (NULL == key) {
         | 
| @@ -235,7 +235,7 @@ cache_init(Cache cache) { | |
| 235 235 | 
             
            }
         | 
| 236 236 |  | 
| 237 237 | 
             
            void
         | 
| 238 | 
            -
             | 
| 238 | 
            +
            cache_cleanup(Cache cache) {
         | 
| 239 239 | 
             
                Slot	*sp = cache->buckets;
         | 
| 240 240 | 
             
                Slot	s;
         | 
| 241 241 | 
             
                Slot	n;
         | 
| @@ -247,7 +247,8 @@ cache_destroy(Cache cache) { | |
| 247 247 | 
             
                for (i = PAGE_BUCKET_SIZE; 0 < i; i--, sp++) {
         | 
| 248 248 | 
             
            	for (s = *sp; NULL != s; s = n) {
         | 
| 249 249 | 
             
            	    n = s->next;
         | 
| 250 | 
            -
            	    DEBUG_FREE(mem_page_slot)
         | 
| 250 | 
            +
            	    DEBUG_FREE(mem_page_slot, s);
         | 
| 251 | 
            +
            	    page_destroy(s->value);
         | 
| 251 252 | 
             
            	    free(s);
         | 
| 252 253 | 
             
            	}
         | 
| 253 254 | 
             
            	*sp = NULL;
         | 
| @@ -256,13 +257,11 @@ cache_destroy(Cache cache) { | |
| 256 257 | 
             
                for (i = MIME_BUCKET_SIZE; 0 < i; i--, mp++) {
         | 
| 257 258 | 
             
            	for (sm = *mp; NULL != sm; sm = m) {
         | 
| 258 259 | 
             
            	    m = sm->next;
         | 
| 259 | 
            -
            	    DEBUG_FREE( | 
| 260 | 
            +
            	    DEBUG_FREE(mem_mime_slot, sm);
         | 
| 260 261 | 
             
            	    free(sm);
         | 
| 261 262 | 
             
            	}
         | 
| 262 263 | 
             
            	*mp = NULL;
         | 
| 263 264 | 
             
                }
         | 
| 264 | 
            -
                //DEBUG_FREE(mem_cache)
         | 
| 265 | 
            -
                free(cache);
         | 
| 266 265 | 
             
            }
         | 
| 267 266 |  | 
| 268 267 | 
             
            // The page resp contents point to the page resp msg to save memory and reduce
         | 
| @@ -272,13 +271,13 @@ page_create(const char *path) { | |
| 272 271 | 
             
                Page	p = (Page)malloc(sizeof(struct _Page));
         | 
| 273 272 |  | 
| 274 273 | 
             
                if (NULL != p) {
         | 
| 275 | 
            -
            	DEBUG_ALLOC(mem_page)
         | 
| 274 | 
            +
            	DEBUG_ALLOC(mem_page, p)
         | 
| 276 275 | 
             
            	p->resp = NULL;
         | 
| 277 276 | 
             
            	if (NULL == path) {
         | 
| 278 277 | 
             
            	    p->path = NULL;
         | 
| 279 278 | 
             
            	} else {
         | 
| 280 279 | 
             
            	    p->path = strdup(path);
         | 
| 281 | 
            -
            	    DEBUG_ALLOC(mem_page_path)
         | 
| 280 | 
            +
            	    DEBUG_ALLOC(mem_page_path, p->path)
         | 
| 282 281 | 
             
            	}
         | 
| 283 282 | 
             
            	p->mtime = 0;
         | 
| 284 283 | 
             
            	p->last_check = 0.0;
         | 
| @@ -292,8 +291,8 @@ page_destroy(Page p) { | |
| 292 291 | 
             
            	text_release(p->resp);
         | 
| 293 292 | 
             
            	p->resp = NULL;
         | 
| 294 293 | 
             
                }
         | 
| 295 | 
            -
                DEBUG_FREE(mem_page_path)
         | 
| 296 | 
            -
                DEBUG_FREE(mem_page)
         | 
| 294 | 
            +
                DEBUG_FREE(mem_page_path, p->path);
         | 
| 295 | 
            +
                DEBUG_FREE(mem_page, p);
         | 
| 297 296 | 
             
                free(p->path);
         | 
| 298 297 | 
             
                free(p);
         | 
| 299 298 | 
             
            }
         | 
| @@ -307,10 +306,10 @@ update_contents(Cache cache, Page p) { | |
| 307 306 | 
             
                long	size;
         | 
| 308 307 | 
             
                struct stat	fattr;
         | 
| 309 308 | 
             
                long	msize;
         | 
| 310 | 
            -
                char	*msg;
         | 
| 311 309 | 
             
                int		cnt;
         | 
| 312 310 | 
             
                struct stat	fs;
         | 
| 313 | 
            -
             | 
| 311 | 
            +
                Text	t;
         | 
| 312 | 
            +
                
         | 
| 314 313 | 
             
                for (; '.' != *suffix; suffix--) {
         | 
| 315 314 | 
             
            	if (suffix <= p->path) {
         | 
| 316 315 | 
             
            	    suffix = NULL;
         | 
| @@ -370,21 +369,19 @@ update_contents(Cache cache, Page p) { | |
| 370 369 | 
             
                // Format size plus space for the length, the mime type, and some
         | 
| 371 370 | 
             
                // padding. Then add the content length.
         | 
| 372 371 | 
             
                msize = sizeof(page_fmt) + 60 + size;
         | 
| 373 | 
            -
                if (NULL == ( | 
| 372 | 
            +
                if (NULL == (t = text_allocate((int)msize))) {
         | 
| 374 373 | 
             
            	return false;
         | 
| 375 374 | 
             
                }
         | 
| 376 | 
            -
                 | 
| 377 | 
            -
                cnt = sprintf(msg, page_fmt, mime, size);
         | 
| 378 | 
            -
             | 
| 375 | 
            +
                cnt = sprintf(t->text, page_fmt, mime, size);
         | 
| 379 376 | 
             
                msize = cnt + size;
         | 
| 380 | 
            -
                if (size != (long)fread( | 
| 377 | 
            +
                if (size != (long)fread(t->text + cnt, 1, size, f)) {
         | 
| 381 378 | 
             
            	fclose(f);
         | 
| 382 | 
            -
            	 | 
| 383 | 
            -
            	free(msg);
         | 
| 379 | 
            +
            	text_release(t);
         | 
| 384 380 | 
             
            	return false;
         | 
| 385 381 | 
             
                }
         | 
| 386 382 | 
             
                fclose(f);
         | 
| 387 | 
            -
                 | 
| 383 | 
            +
                t->text[msize] = '\0';
         | 
| 384 | 
            +
                t->len = msize;
         | 
| 388 385 | 
             
                if (0 == stat(p->path, &fattr)) {
         | 
| 389 386 | 
             
            	p->mtime = fattr.st_mtime;
         | 
| 390 387 | 
             
                } else {
         | 
| @@ -394,7 +391,7 @@ update_contents(Cache cache, Page p) { | |
| 394 391 | 
             
            	text_release(p->resp);
         | 
| 395 392 | 
             
            	p->resp = NULL;
         | 
| 396 393 | 
             
                }
         | 
| 397 | 
            -
                p->resp =  | 
| 394 | 
            +
                p->resp = t;
         | 
| 398 395 | 
             
                text_ref(p->resp);
         | 
| 399 396 | 
             
                p->last_check = dtime();
         | 
| 400 397 |  | 
    
        data/ext/agoo/page.h
    CHANGED
    
    | @@ -46,6 +46,8 @@ typedef struct _Cache { | |
| 46 46 | 
             
            } *Cache;
         | 
| 47 47 |  | 
| 48 48 | 
             
            extern void	cache_init(Cache cache);
         | 
| 49 | 
            +
            extern void	cache_cleanup(Cache cache);
         | 
| 50 | 
            +
             | 
| 49 51 | 
             
            extern void	page_destroy(Page p);
         | 
| 50 52 | 
             
            extern Page	page_get(Err err, Cache cache, const char *dir, const char *path, int plen);
         | 
| 51 53 | 
             
            extern void	mime_set(Cache cache, const char *key, const char *value);
         | 
    
        data/ext/agoo/pub.c
    ADDED
    
    | @@ -0,0 +1,111 @@ | |
| 1 | 
            +
            // Copyright (c) 2018, Peter Ohler, All rights reserved.
         | 
| 2 | 
            +
             | 
| 3 | 
            +
            #include <stdio.h>
         | 
| 4 | 
            +
            #include <stdlib.h>
         | 
| 5 | 
            +
            #include <string.h>
         | 
| 6 | 
            +
             | 
| 7 | 
            +
            #include "debug.h"
         | 
| 8 | 
            +
            #include "pub.h"
         | 
| 9 | 
            +
            #include "text.h"
         | 
| 10 | 
            +
             | 
| 11 | 
            +
            Pub
         | 
| 12 | 
            +
            pub_close(uint64_t cid) {
         | 
| 13 | 
            +
                Pub	p = (Pub)malloc(sizeof(struct _Pub));
         | 
| 14 | 
            +
             | 
| 15 | 
            +
                if (NULL != p) {
         | 
| 16 | 
            +
            	DEBUG_ALLOC(mem_pub, p);
         | 
| 17 | 
            +
            	p->next = NULL;
         | 
| 18 | 
            +
            	p->kind = PUB_CLOSE;
         | 
| 19 | 
            +
            	p->cid = cid;
         | 
| 20 | 
            +
            	p->sid = 0;
         | 
| 21 | 
            +
            	p->subject = NULL;
         | 
| 22 | 
            +
                }
         | 
| 23 | 
            +
                return p;
         | 
| 24 | 
            +
            }
         | 
| 25 | 
            +
             | 
| 26 | 
            +
            Pub
         | 
| 27 | 
            +
            pub_subscribe(uint64_t cid, uint64_t sid, const char *subject) {
         | 
| 28 | 
            +
                Pub	p = (Pub)malloc(sizeof(struct _Pub));
         | 
| 29 | 
            +
             | 
| 30 | 
            +
                if (NULL != p) {
         | 
| 31 | 
            +
            	DEBUG_ALLOC(mem_pub, p);
         | 
| 32 | 
            +
            	p->next = NULL;
         | 
| 33 | 
            +
            	p->kind = PUB_SUB;
         | 
| 34 | 
            +
            	p->cid = cid;
         | 
| 35 | 
            +
            	p->sid = sid;
         | 
| 36 | 
            +
            	p->subject = strdup(subject);
         | 
| 37 | 
            +
                }
         | 
| 38 | 
            +
                return p;
         | 
| 39 | 
            +
            }
         | 
| 40 | 
            +
             | 
| 41 | 
            +
            Pub
         | 
| 42 | 
            +
            pub_unsubscribe(uint64_t cid, uint64_t sid) {
         | 
| 43 | 
            +
                Pub	p = (Pub)malloc(sizeof(struct _Pub));
         | 
| 44 | 
            +
             | 
| 45 | 
            +
                if (NULL != p) {
         | 
| 46 | 
            +
            	DEBUG_ALLOC(mem_pub, p);
         | 
| 47 | 
            +
            	p->next = NULL;
         | 
| 48 | 
            +
            	p->kind = PUB_UN;
         | 
| 49 | 
            +
            	p->cid = cid;
         | 
| 50 | 
            +
            	p->sid = sid;
         | 
| 51 | 
            +
            	p->subject = NULL;
         | 
| 52 | 
            +
                }
         | 
| 53 | 
            +
                return p;
         | 
| 54 | 
            +
            }
         | 
| 55 | 
            +
             | 
| 56 | 
            +
            Pub
         | 
| 57 | 
            +
            pub_publish(char *subject, const char *message, size_t mlen, bool bin) {
         | 
| 58 | 
            +
                Pub	p = (Pub)malloc(sizeof(struct _Pub));
         | 
| 59 | 
            +
             | 
| 60 | 
            +
                if (NULL != p) {
         | 
| 61 | 
            +
            	DEBUG_ALLOC(mem_pub, p);
         | 
| 62 | 
            +
            	p->next = NULL;
         | 
| 63 | 
            +
            	p->kind = PUB_MSG;
         | 
| 64 | 
            +
            	p->cid = 0;
         | 
| 65 | 
            +
            	p->subject = strdup(subject);
         | 
| 66 | 
            +
            	// Allocate an extra 24 bytes so the message can be expanded in place
         | 
| 67 | 
            +
            	// if a WebSocket or SSE write.
         | 
| 68 | 
            +
            	p->msg = text_allocate((int)mlen + 24);
         | 
| 69 | 
            +
            	p->msg = text_append(text_allocate((int)mlen + 16), message, (int)mlen);
         | 
| 70 | 
            +
            	text_ref(p->msg);
         | 
| 71 | 
            +
                }
         | 
| 72 | 
            +
                return p;
         | 
| 73 | 
            +
            }
         | 
| 74 | 
            +
             | 
| 75 | 
            +
            Pub
         | 
| 76 | 
            +
            pub_write(uint64_t cid, const char *message, size_t mlen, bool bin) {
         | 
| 77 | 
            +
                // Allocate an extra 16 bytes so the message can be expanded in place if a
         | 
| 78 | 
            +
                // WebSocket write.
         | 
| 79 | 
            +
                Pub	p = (Pub)malloc(sizeof(struct _Pub));
         | 
| 80 | 
            +
             | 
| 81 | 
            +
                if (NULL != p) {
         | 
| 82 | 
            +
            	DEBUG_ALLOC(mem_pub, p);
         | 
| 83 | 
            +
            	p->next = NULL;
         | 
| 84 | 
            +
            	p->kind = PUB_WRITE;
         | 
| 85 | 
            +
            	p->cid = cid;
         | 
| 86 | 
            +
            	p->subject = NULL;
         | 
| 87 | 
            +
            	// Allocate an extra 16 bytes so the message can be expanded in place
         | 
| 88 | 
            +
            	// if a WebSocket write.
         | 
| 89 | 
            +
            	p->msg = text_append(text_allocate((int)mlen + 16), message, (int)mlen);
         | 
| 90 | 
            +
            	p->msg->bin = bin;
         | 
| 91 | 
            +
            	text_ref(p->msg);
         | 
| 92 | 
            +
                }
         | 
| 93 | 
            +
                return p;
         | 
| 94 | 
            +
            }
         | 
| 95 | 
            +
             | 
| 96 | 
            +
            void
         | 
| 97 | 
            +
            pub_destroy(Pub pub) {
         | 
| 98 | 
            +
                switch (pub->kind) {
         | 
| 99 | 
            +
                case PUB_MSG:
         | 
| 100 | 
            +
                case PUB_WRITE:
         | 
| 101 | 
            +
            	if (NULL != pub->msg) {
         | 
| 102 | 
            +
            	    text_release(pub->msg);
         | 
| 103 | 
            +
            	}
         | 
| 104 | 
            +
            	break;
         | 
| 105 | 
            +
                default:
         | 
| 106 | 
            +
            	break;
         | 
| 107 | 
            +
                }
         | 
| 108 | 
            +
                DEBUG_FREE(mem_pub, pub);
         | 
| 109 | 
            +
                free(pub);
         | 
| 110 | 
            +
            }
         | 
| 111 | 
            +
             | 
    
        data/ext/agoo/pub.h
    ADDED
    
    | @@ -0,0 +1,40 @@ | |
| 1 | 
            +
            // Copyright (c) 2018, Peter Ohler, All rights reserved.
         | 
| 2 | 
            +
             | 
| 3 | 
            +
            #ifndef __AGOO_PUB_H__
         | 
| 4 | 
            +
            #define __AGOO_PUB_H__
         | 
| 5 | 
            +
             | 
| 6 | 
            +
            #include <stdbool.h>
         | 
| 7 | 
            +
            #include <stdint.h>
         | 
| 8 | 
            +
            #include <stdlib.h>
         | 
| 9 | 
            +
             | 
| 10 | 
            +
            struct _Text;
         | 
| 11 | 
            +
             | 
| 12 | 
            +
            typedef enum {
         | 
| 13 | 
            +
                PUB_SUB	= 'S',
         | 
| 14 | 
            +
                PUB_CLOSE	= 'C',
         | 
| 15 | 
            +
                PUB_UN	= 'U',
         | 
| 16 | 
            +
                PUB_MSG	= 'M',
         | 
| 17 | 
            +
                PUB_WRITE	= 'W',
         | 
| 18 | 
            +
            } PubKind;
         | 
| 19 | 
            +
             | 
| 20 | 
            +
            // Generated by extened handlers and placed on the pub_queue to be pulled off
         | 
| 21 | 
            +
            // in the con_loop.
         | 
| 22 | 
            +
            typedef struct _Pub {
         | 
| 23 | 
            +
                struct _Pub		*next;
         | 
| 24 | 
            +
                PubKind		kind;
         | 
| 25 | 
            +
                uint64_t		cid;
         | 
| 26 | 
            +
                char		*subject;
         | 
| 27 | 
            +
                union {
         | 
| 28 | 
            +
            	uint64_t	sid;
         | 
| 29 | 
            +
            	struct _Text	*msg;
         | 
| 30 | 
            +
                };
         | 
| 31 | 
            +
            } *Pub;
         | 
| 32 | 
            +
             | 
| 33 | 
            +
            extern Pub	pub_close(uint64_t cid);
         | 
| 34 | 
            +
            extern Pub	pub_subscribe(uint64_t cid, uint64_t sid, const char *subject);
         | 
| 35 | 
            +
            extern Pub	pub_unsubscribe(uint64_t cid, uint64_t sid);
         | 
| 36 | 
            +
            extern Pub	pub_publish(char *subject, const char *message, size_t mlen, bool bin);
         | 
| 37 | 
            +
            extern Pub	pub_write(uint64_t cid, const char *message, size_t mlen, bool bin);
         | 
| 38 | 
            +
            extern void	pub_destroy(Pub pub);
         | 
| 39 | 
            +
             | 
| 40 | 
            +
            #endif // __AGOO_PUB_H__
         | 
    
        data/ext/agoo/queue.c
    CHANGED
    
    | @@ -35,7 +35,7 @@ queue_multi_init(Queue q, size_t qsize, bool multi_push, bool multi_pop) { | |
| 35 35 | 
             
            	qsize = 4;
         | 
| 36 36 | 
             
                }
         | 
| 37 37 | 
             
                q->q = (QItem*)malloc(sizeof(QItem) * qsize);
         | 
| 38 | 
            -
                DEBUG_ALLOC(mem_qitem)
         | 
| 38 | 
            +
                DEBUG_ALLOC(mem_qitem, q->q)
         | 
| 39 39 | 
             
                q->end = q->q + qsize;
         | 
| 40 40 |  | 
| 41 41 | 
             
                memset(q->q, 0, sizeof(QItem) * qsize);
         | 
| @@ -53,7 +53,7 @@ queue_multi_init(Queue q, size_t qsize, bool multi_push, bool multi_pop) { | |
| 53 53 |  | 
| 54 54 | 
             
            void
         | 
| 55 55 | 
             
            queue_cleanup(Queue q) {
         | 
| 56 | 
            -
                DEBUG_FREE(mem_qitem)
         | 
| 56 | 
            +
                DEBUG_FREE(mem_qitem, q->q)
         | 
| 57 57 | 
             
                free(q->q);
         | 
| 58 58 | 
             
                q->q = NULL;
         | 
| 59 59 | 
             
                q->end = NULL;
         | 
    
        data/ext/agoo/rack_logger.c
    CHANGED
    
    | @@ -9,33 +9,19 @@ | |
| 9 9 |  | 
| 10 10 | 
             
            static VALUE	rl_class = Qundef;
         | 
| 11 11 |  | 
| 12 | 
            -
            typedef struct _RackLogger {
         | 
| 13 | 
            -
                Server	server;
         | 
| 14 | 
            -
            } *RackLogger;
         | 
| 15 | 
            -
             | 
| 16 | 
            -
            static void
         | 
| 17 | 
            -
            rack_logger_free(void *ptr) {
         | 
| 18 | 
            -
                DEBUG_FREE(mem_rack_logger)
         | 
| 19 | 
            -
                xfree(ptr);
         | 
| 20 | 
            -
            }
         | 
| 21 | 
            -
             | 
| 22 12 | 
             
            VALUE
         | 
| 23 | 
            -
            rack_logger_new( | 
| 24 | 
            -
                 | 
| 25 | 
            -
             | 
| 26 | 
            -
                DEBUG_ALLOC(mem_rack_logger)
         | 
| 27 | 
            -
                rl->server = server;
         | 
| 28 | 
            -
                
         | 
| 29 | 
            -
                //return Data_Wrap_Struct(rl_class, NULL, xfree, rl);
         | 
| 30 | 
            -
                return Data_Wrap_Struct(rl_class, NULL, rack_logger_free, rl);
         | 
| 13 | 
            +
            rack_logger_new() {
         | 
| 14 | 
            +
                return rb_class_new_instance(0, NULL, rl_class);
         | 
| 31 15 | 
             
            }
         | 
| 32 16 |  | 
| 33 17 | 
             
            static void
         | 
| 34 | 
            -
            log_message( | 
| 18 | 
            +
            log_message(LogCat cat, VALUE message) {
         | 
| 35 19 | 
             
                volatile VALUE	rs = rb_funcall(message, rb_intern("to_s"), 0);
         | 
| 36 20 |  | 
| 37 21 | 
             
                rb_check_type(rs, T_STRING);
         | 
| 38 | 
            -
             | 
| 22 | 
            +
                if (!the_server.active) {
         | 
| 23 | 
            +
            	return;
         | 
| 24 | 
            +
                }
         | 
| 39 25 | 
             
                if (rb_block_given_p()) {
         | 
| 40 26 | 
             
            	Text		text = text_create(StringValuePtr(rs), (int)RSTRING_LEN(rs));
         | 
| 41 27 | 
             
            	volatile VALUE	x = rb_yield_values(0);
         | 
| @@ -45,51 +31,13 @@ log_message(RackLogger rl, LogLevel level, VALUE message) { | |
| 45 31 | 
             
            	    text = text_append(text, ": ", 2);
         | 
| 46 32 | 
             
            	    text = text_append(text, StringValuePtr(rs), (int)RSTRING_LEN(rs));
         | 
| 47 33 | 
             
            	}
         | 
| 48 | 
            -
            	 | 
| 49 | 
            -
            	case FATAL:
         | 
| 50 | 
            -
            	    log_cat(&rl->server->error_cat, "%s", text->text);
         | 
| 51 | 
            -
            	    exit(0);
         | 
| 52 | 
            -
            	    break;
         | 
| 53 | 
            -
            	case ERROR:
         | 
| 54 | 
            -
            	    log_cat(&rl->server->error_cat, "%s", text->text);
         | 
| 55 | 
            -
            	    break;
         | 
| 56 | 
            -
            	case WARN:
         | 
| 57 | 
            -
            	    log_cat(&rl->server->warn_cat, "%s", text->text);
         | 
| 58 | 
            -
            	    break;
         | 
| 59 | 
            -
            	case INFO:
         | 
| 60 | 
            -
            	    log_cat(&rl->server->info_cat, "%s", text->text);
         | 
| 61 | 
            -
            	    break;
         | 
| 62 | 
            -
            	case DEBUG:
         | 
| 63 | 
            -
            	    log_cat(&rl->server->debug_cat, "%s", text->text);
         | 
| 64 | 
            -
            	    break;
         | 
| 65 | 
            -
            	default:
         | 
| 66 | 
            -
            	    break;
         | 
| 67 | 
            -
            	}
         | 
| 34 | 
            +
            	log_cat(cat, "%s", text->text);
         | 
| 68 35 | 
             
            	text_release(text);
         | 
| 69 36 | 
             
                } else {
         | 
| 70 | 
            -
            	 | 
| 71 | 
            -
            	case FATAL:
         | 
| 72 | 
            -
            	    log_cat(&rl->server->error_cat, "%s", StringValuePtr(rs));
         | 
| 73 | 
            -
            	    exit(0);
         | 
| 74 | 
            -
            	    break;
         | 
| 75 | 
            -
            	case ERROR:
         | 
| 76 | 
            -
            	    log_cat(&rl->server->error_cat, "%s", StringValuePtr(rs));
         | 
| 77 | 
            -
            	    break;
         | 
| 78 | 
            -
            	case WARN:
         | 
| 79 | 
            -
            	    log_cat(&rl->server->warn_cat, "%s", StringValuePtr(rs));
         | 
| 80 | 
            -
            	    break;
         | 
| 81 | 
            -
            	case INFO:
         | 
| 82 | 
            -
            	    log_cat(&rl->server->info_cat, "%s", StringValuePtr(rs));
         | 
| 83 | 
            -
            	    break;
         | 
| 84 | 
            -
            	case DEBUG:
         | 
| 85 | 
            -
            	    log_cat(&rl->server->debug_cat, "%s", StringValuePtr(rs));
         | 
| 86 | 
            -
            	    break;
         | 
| 87 | 
            -
            	default:
         | 
| 88 | 
            -
            	    break;
         | 
| 89 | 
            -
            	}
         | 
| 37 | 
            +
            	log_cat(cat, "%s", StringValuePtr(rs));
         | 
| 90 38 | 
             
                }
         | 
| 91 39 | 
             
            }
         | 
| 92 | 
            -
             | 
| 40 | 
            +
             | 
| 93 41 | 
             
            /* Document-method: debug
         | 
| 94 42 | 
             
             *
         | 
| 95 43 | 
             
             * call-seq: debug(message, &block)
         | 
| @@ -98,8 +46,7 @@ log_message(RackLogger rl, LogLevel level, VALUE message) { | |
| 98 46 | 
             
             */
         | 
| 99 47 | 
             
            static VALUE
         | 
| 100 48 | 
             
            rl_debug(VALUE self, VALUE message) {
         | 
| 101 | 
            -
                log_message( | 
| 102 | 
            -
             | 
| 49 | 
            +
                log_message(&debug_cat, message);
         | 
| 103 50 | 
             
                return Qnil;
         | 
| 104 51 | 
             
            }
         | 
| 105 52 |  | 
| @@ -111,8 +58,7 @@ rl_debug(VALUE self, VALUE message) { | |
| 111 58 | 
             
             */
         | 
| 112 59 | 
             
            static VALUE
         | 
| 113 60 | 
             
            rl_info(VALUE self, VALUE message) {
         | 
| 114 | 
            -
                log_message( | 
| 115 | 
            -
             | 
| 61 | 
            +
                log_message(&info_cat, message);
         | 
| 116 62 | 
             
                return Qnil;
         | 
| 117 63 | 
             
            }
         | 
| 118 64 |  | 
| @@ -124,8 +70,7 @@ rl_info(VALUE self, VALUE message) { | |
| 124 70 | 
             
             */
         | 
| 125 71 | 
             
            static VALUE
         | 
| 126 72 | 
             
            rl_warn(VALUE self, VALUE message) {
         | 
| 127 | 
            -
                log_message( | 
| 128 | 
            -
             | 
| 73 | 
            +
                log_message(&warn_cat, message);
         | 
| 129 74 | 
             
                return Qnil;
         | 
| 130 75 | 
             
            }
         | 
| 131 76 |  | 
| @@ -137,8 +82,7 @@ rl_warn(VALUE self, VALUE message) { | |
| 137 82 | 
             
             */
         | 
| 138 83 | 
             
            static VALUE
         | 
| 139 84 | 
             
            rl_error(VALUE self, VALUE message) {
         | 
| 140 | 
            -
                log_message( | 
| 141 | 
            -
             | 
| 85 | 
            +
                log_message(&error_cat, message);
         | 
| 142 86 | 
             
                return Qnil;
         | 
| 143 87 | 
             
            }
         | 
| 144 88 |  | 
| @@ -150,8 +94,8 @@ rl_error(VALUE self, VALUE message) { | |
| 150 94 | 
             
             */
         | 
| 151 95 | 
             
            static VALUE
         | 
| 152 96 | 
             
            rl_fatal(VALUE self, VALUE message) {
         | 
| 153 | 
            -
                log_message( | 
| 154 | 
            -
             | 
| 97 | 
            +
                log_message(&fatal_cat, message);
         | 
| 98 | 
            +
                exit(0);
         | 
| 155 99 | 
             
                return Qnil;
         | 
| 156 100 | 
             
            }
         | 
| 157 101 |  |