diff --git a/examples/map.c b/examples/map.c index 1d1813a..bb129af 100644 --- a/examples/map.c +++ b/examples/map.c @@ -19,7 +19,7 @@ int main(int argc, char **argv) { printf("%p\n", skipstone_map_get(map, 0xdead)); printf("%p\n", skipstone_map_get(map, 0xbeef)); - skipstone_map_destroy(map); + skipstone_map_destroy(map, NULL); return 0; } diff --git a/examples/map.c-e b/examples/map.c-e index 1d1813a..bb129af 100644 --- a/examples/map.c-e +++ b/examples/map.c-e @@ -19,7 +19,7 @@ int main(int argc, char **argv) { printf("%p\n", skipstone_map_get(map, 0xdead)); printf("%p\n", skipstone_map_get(map, 0xbeef)); - skipstone_map_destroy(map); + skipstone_map_destroy(map, NULL); return 0; } diff --git a/examples/queue.c b/examples/queue.c index cfac7e8..e81ac72 100644 --- a/examples/queue.c +++ b/examples/queue.c @@ -19,7 +19,7 @@ int main(int argc, char **argv) { printf("%s\n", message); - skipstone_queue_destroy(queue); + skipstone_queue_destroy(queue, NULL); return 0; } diff --git a/examples/queue.c-e b/examples/queue.c-e index cfac7e8..e81ac72 100644 --- a/examples/queue.c-e +++ b/examples/queue.c-e @@ -19,7 +19,7 @@ int main(int argc, char **argv) { printf("%s\n", message); - skipstone_queue_destroy(queue); + skipstone_queue_destroy(queue, NULL); return 0; } diff --git a/examples/test.c b/examples/test.c index fa2c83d..c0a36db 100644 --- a/examples/test.c +++ b/examples/test.c @@ -22,9 +22,6 @@ static int answer_music_message(skipstone_message_service *service, void *buf, uint16_t size, uint16_t id, void *context) { skipstone_message *message = skipstone_message_new(); - printf("Received music message size %hu value %02x\n", size, - ((uint8_t *)buf)[0]); - skipstone_message_append_uint8(message, 0x10); skipstone_message_append_string(message, "KMFDM", 5); skipstone_message_append_string(message, "Nihil", 5); diff --git a/examples/test.c-e b/examples/test.c-e index fa2c83d..c0a36db 100644 --- a/examples/test.c-e +++ b/examples/test.c-e @@ -22,9 +22,6 @@ static int answer_music_message(skipstone_message_service *service, void *buf, uint16_t size, uint16_t id, void *context) { skipstone_message *message = skipstone_message_new(); - printf("Received music message size %hu value %02x\n", size, - ((uint8_t *)buf)[0]); - skipstone_message_append_uint8(message, 0x10); skipstone_message_append_string(message, "KMFDM", 5); skipstone_message_append_string(message, "Nihil", 5); diff --git a/include/skipstone/map.h b/include/skipstone/map.h index 4b44577..44265c2 100644 --- a/include/skipstone/map.h +++ b/include/skipstone/map.h @@ -15,7 +15,7 @@ typedef struct _skipstone_map { skipstone_map *skipstone_map_new(); -void skipstone_map_destroy(skipstone_map *map); +void skipstone_map_destroy(skipstone_map *map, void (*destructor)(void *)); void *skipstone_map_get(skipstone_map *map, uint16_t index); diff --git a/include/skipstone/message.h b/include/skipstone/message.h index 176bad1..d59fbdc 100644 --- a/include/skipstone/message.h +++ b/include/skipstone/message.h @@ -58,6 +58,8 @@ int skipstone_message_pack(skipstone_message *message, void *buf); skipstone_message_service *skipstone_message_service_new(); +void skipstone_message_service_destroy(skipstone_message_service *service); + int skipstone_message_service_register(skipstone_message_service *service, uint16_t id, skipstone_message_handler *handler, void *context); @@ -70,6 +72,9 @@ int skipstone_message_service_queue_packed(skipstone_message_service *service, int skipstone_message_service_queue(skipstone_message_service *service, skipstone_message *message, uint16_t id); +int skipstone_message_service_next_event(skipstone_message_service *service, + skipstone_link *link); + int skipstone_message_service_run(skipstone_message_service *service, skipstone_link *link); diff --git a/include/skipstone/queue.h b/include/skipstone/queue.h index 22bad44..382b127 100644 --- a/include/skipstone/queue.h +++ b/include/skipstone/queue.h @@ -7,12 +7,12 @@ typedef struct _skipstone_queue skipstone_queue; skipstone_queue *skipstone_queue_new(); +void skipstone_queue_destroy(skipstone_queue *queue); + size_t skipstone_queue_count(skipstone_queue *queue); int skipstone_queue_add(skipstone_queue *queue, void *value); int skipstone_queue_remove(skipstone_queue *queue, void **value); -void skipstone_queue_destroy(skipstone_queue *queue); - #endif /* _SKIPSTONE_QUEUE_H */ diff --git a/src/map.c b/src/map.c index 3d0ce2d..b8426a7 100644 --- a/src/map.c +++ b/src/map.c @@ -18,24 +18,24 @@ error_malloc_map: return NULL; } -static void _destroy(skipstone_map *map, int depth) { +static void _destroy(skipstone_map *map, void (*destructor)(void *), int depth) { uint16_t i; - if (depth > SKIPSTONE_MAP_DEPTH) { - return; - } - for (i=0; i SKIPSTONE_MAP_DEPTH) { - return; - } - for (i=0; ibuf = malloc(SKIPSTONE_MESSAGE_MAX_PAYLOAD)) == NULL) { + goto error_malloc_buf; + } + if ((service->endpoints = skipstone_map_new()) == NULL) { goto error_map_new_endpoints; } @@ -185,15 +190,36 @@ skipstone_message_service *skipstone_message_service_new() { return service; error_queue_new_pending: - skipstone_map_destroy(service->endpoints); + skipstone_map_destroy(service->endpoints, free); error_map_new_endpoints: + free(service->buf); + +error_malloc_buf: free(service); error_malloc_service: return NULL; } +void skipstone_message_service_destroy(skipstone_message_service *service) { + skipstone_message *message; + + skipstone_map_destroy(service->endpoints, free); + + while (skipstone_queue_remove(service->pending, (void **)&message)) { + skipstone_message_destroy(message); + } + + skipstone_queue_destroy(service->pending); + + free(service->buf); + + free(service); + + return; +} + int skipstone_message_service_register(skipstone_message_service *service, uint16_t id, skipstone_message_handler *handler, void *context) { struct endpoint *endpoint; @@ -271,41 +297,44 @@ error_malloc_packed: return -1; } -int skipstone_message_service_run(skipstone_message_service *service, +int skipstone_message_service_next_event(skipstone_message_service *service, skipstone_link *link) { - void *buf; + skipstone_message_header *message; + struct endpoint *endpoint; + uint16_t size, id; - if ((buf = malloc(SKIPSTONE_MESSAGE_MAX_PAYLOAD)) == NULL) { - goto error_malloc_buf; + if (skipstone_link_recv(link, service->buf, &size, &id) < 0) { + goto error_io; } - while (1) { - skipstone_message_header *message; - struct endpoint *endpoint; - uint16_t size, id; - - if (skipstone_link_recv(link, buf, &size, &id) < 0) { + if ((endpoint = skipstone_map_get(service->endpoints, id)) != NULL) { + if (endpoint->handler(service, service->buf, size, id, endpoint->context) < 0) { goto error_io; } + } - if ((endpoint = skipstone_map_get(service->endpoints, id)) != NULL) { - if (endpoint->handler(service, buf, size, id, endpoint->context) < 0) { - goto error_io; - } - } - - while (skipstone_queue_remove(service->pending, (void **)&message)) { - if (skipstone_link_send(link, message + 1, message->size, message->id) < 0) { - goto error_io; - } + while (skipstone_queue_remove(service->pending, (void **)&message)) { + if (skipstone_link_send(link, message + 1, message->size, message->id) < 0) { + goto error_io; } } return 0; error_io: - free(buf); - -error_malloc_buf: + return -1; +} + +int skipstone_message_service_run(skipstone_message_service *service, + skipstone_link *link) { + while (1) { + if (skipstone_message_service_next_event(service, link) < 0) { + goto error_service_next_event; + } + } + + return 0; + +error_service_next_event: return -1; } diff --git a/src/message.c-e b/src/message.c-e index 96f8d13..5f731b4 100644 --- a/src/message.c-e +++ b/src/message.c-e @@ -24,6 +24,7 @@ struct endpoint { struct _skipstone_message_service { skipstone_map *endpoints; skipstone_queue *pending; + void *buf; }; skipstone_message *skipstone_message_new() { @@ -174,6 +175,10 @@ skipstone_message_service *skipstone_message_service_new() { goto error_malloc_service; } + if ((service->buf = malloc(SKIPSTONE_MESSAGE_MAX_PAYLOAD)) == NULL) { + goto error_malloc_buf; + } + if ((service->endpoints = skipstone_map_new()) == NULL) { goto error_map_new_endpoints; } @@ -185,15 +190,36 @@ skipstone_message_service *skipstone_message_service_new() { return service; error_queue_new_pending: - skipstone_map_destroy(service->endpoints); + skipstone_map_destroy(service->endpoints, free); error_map_new_endpoints: + free(service->buf); + +error_malloc_buf: free(service); error_malloc_service: return NULL; } +void skipstone_message_service_destroy(skipstone_message_service *service) { + skipstone_message *message; + + skipstone_map_destroy(service->endpoints, free); + + while (skipstone_queue_remove(service->pending, (void **)&message)) { + skipstone_message_destroy(message); + } + + skipstone_queue_destroy(service->pending); + + free(service->buf); + + free(service); + + return; +} + int skipstone_message_service_register(skipstone_message_service *service, uint16_t id, skipstone_message_handler *handler, void *context) { struct endpoint *endpoint; @@ -271,41 +297,44 @@ error_malloc_packed: return -1; } -int skipstone_message_service_run(skipstone_message_service *service, +int skipstone_message_service_next_event(skipstone_message_service *service, skipstone_link *link) { - void *buf; + skipstone_message_header *message; + struct endpoint *endpoint; + uint16_t size, id; - if ((buf = malloc(SKIPSTONE_MESSAGE_MAX_PAYLOAD)) == NULL) { - goto error_malloc_buf; + if (skipstone_link_recv(link, service->buf, &size, &id) < 0) { + goto error_io; } - while (1) { - skipstone_message_header *message; - struct endpoint *endpoint; - uint16_t size, id; - - if (skipstone_link_recv(link, buf, &size, &id) < 0) { + if ((endpoint = skipstone_map_get(service->endpoints, id)) != NULL) { + if (endpoint->handler(service, service->buf, size, id, endpoint->context) < 0) { goto error_io; } + } - if ((endpoint = skipstone_map_get(service->endpoints, id)) != NULL) { - if (endpoint->handler(service, buf, size, id, endpoint->context) < 0) { - goto error_io; - } - } - - while (skipstone_queue_remove(service->pending, (void **)&message)) { - if (skipstone_link_send(link, message + 1, message->size, message->id) < 0) { - goto error_io; - } + while (skipstone_queue_remove(service->pending, (void **)&message)) { + if (skipstone_link_send(link, message + 1, message->size, message->id) < 0) { + goto error_io; } } return 0; error_io: - free(buf); - -error_malloc_buf: + return -1; +} + +int skipstone_message_service_run(skipstone_message_service *service, + skipstone_link *link) { + while (1) { + if (skipstone_message_service_next_event(service, link) < 0) { + goto error_service_next_event; + } + } + + return 0; + +error_service_next_event: return -1; } diff --git a/src/watch.c b/src/watch.c index 6be21df..e0d7e70 100644 --- a/src/watch.c +++ b/src/watch.c @@ -8,10 +8,6 @@ struct _skipstone_watch { skipstone_map *endpoints; }; -struct endpoint { - -}; - skipstone_watch *skipstone_watch_new(skipstone_link *link) { skipstone_watch *watch; @@ -35,7 +31,7 @@ error_malloc_watch: } void skipstone_watch_destroy(skipstone_watch *watch) { - skipstone_map_destroy(watch->endpoints); + skipstone_map_destroy(watch->endpoints, NULL); free(watch); } diff --git a/src/watch.c-e b/src/watch.c-e index 6be21df..e0d7e70 100644 --- a/src/watch.c-e +++ b/src/watch.c-e @@ -8,10 +8,6 @@ struct _skipstone_watch { skipstone_map *endpoints; }; -struct endpoint { - -}; - skipstone_watch *skipstone_watch_new(skipstone_link *link) { skipstone_watch *watch; @@ -35,7 +31,7 @@ error_malloc_watch: } void skipstone_watch_destroy(skipstone_watch *watch) { - skipstone_map_destroy(watch->endpoints); + skipstone_map_destroy(watch->endpoints, NULL); free(watch); }