diff --git a/examples/Makefile b/examples/Makefile index 0e74b74..9dfbbe1 100644 --- a/examples/Makefile +++ b/examples/Makefile @@ -7,7 +7,7 @@ INCLUDE_PATH = ../include CFLAGS += -I$(INCLUDE_PATH) LDFLAGS = -L../src -lskipstone -EXAMPLES = read music map test +EXAMPLES = read music map test queue RM = /bin/rm diff --git a/examples/queue.c b/examples/queue.c new file mode 100644 index 0000000..1e139f2 --- /dev/null +++ b/examples/queue.c @@ -0,0 +1,25 @@ +#include +#include +#include + +#include + +int main(int argc, char **argv) { + skipstone_queue *queue; + char *message; + + if ((queue = skipstone_queue_new()) == NULL) { + perror("skipstone_queue_new()"); + + return 1; + } + + skipstone_queue_push(queue, "poop"); + skipstone_queue_pop(queue, &message); + + printf("%s\n", message); + + skipstone_queue_destroy(queue); + + return 0; +} diff --git a/examples/queue.c-e b/examples/queue.c-e new file mode 100644 index 0000000..1e139f2 --- /dev/null +++ b/examples/queue.c-e @@ -0,0 +1,25 @@ +#include +#include +#include + +#include + +int main(int argc, char **argv) { + skipstone_queue *queue; + char *message; + + if ((queue = skipstone_queue_new()) == NULL) { + perror("skipstone_queue_new()"); + + return 1; + } + + skipstone_queue_push(queue, "poop"); + skipstone_queue_pop(queue, &message); + + printf("%s\n", message); + + skipstone_queue_destroy(queue); + + return 0; +} diff --git a/include/skipstone/queue.h b/include/skipstone/queue.h index 825067f..c5b15d6 100644 --- a/include/skipstone/queue.h +++ b/include/skipstone/queue.h @@ -13,4 +13,6 @@ int skipstone_queue_push(skipstone_queue *queue, void *value); int skipstone_queue_pop(skipstone_queue *queue, void **value); +void skipstone_queue_destroy(skipstone_queue *queue); + #endif /* _SKIPSTONE_QUEUE_H */ diff --git a/src/message.c b/src/message.c index f9754fc..8efb14f 100644 --- a/src/message.c +++ b/src/message.c @@ -19,7 +19,30 @@ struct _skipstone_message_service { }; skipstone_message_service *skipstone_message_service_new() { - return (skipstone_message_service *)skipstone_map_new(); + skipstone_message_service *service; + + if ((service = malloc(sizeof(*service))) == NULL) { + goto error_malloc_service; + } + + if ((service->endpoints = skipstone_map_new()) == NULL) { + goto error_map_new_endpoints; + } + + if ((service->pending = skipstone_queue_new()) == NULL) { + goto error_queue_new_pending; + } + + return service; + +error_queue_new_pending: + skipstone_map_destroy(service->endpoints); + +error_map_new_endpoints: + free(service); + +error_malloc_service: + return NULL; } int skipstone_message_service_register(skipstone_message_service *service, diff --git a/src/message.c-e b/src/message.c-e index f9754fc..8efb14f 100644 --- a/src/message.c-e +++ b/src/message.c-e @@ -19,7 +19,30 @@ struct _skipstone_message_service { }; skipstone_message_service *skipstone_message_service_new() { - return (skipstone_message_service *)skipstone_map_new(); + skipstone_message_service *service; + + if ((service = malloc(sizeof(*service))) == NULL) { + goto error_malloc_service; + } + + if ((service->endpoints = skipstone_map_new()) == NULL) { + goto error_map_new_endpoints; + } + + if ((service->pending = skipstone_queue_new()) == NULL) { + goto error_queue_new_pending; + } + + return service; + +error_queue_new_pending: + skipstone_map_destroy(service->endpoints); + +error_map_new_endpoints: + free(service); + +error_malloc_service: + return NULL; } int skipstone_message_service_register(skipstone_message_service *service, diff --git a/src/queue.c b/src/queue.c index 6c6e39a..8935a29 100644 --- a/src/queue.c +++ b/src/queue.c @@ -28,6 +28,18 @@ error_malloc_queue: return NULL; } +void skipstone_queue_destroy(skipstone_queue *queue) { + while (queue->last) { + struct entry *entry = queue->last; + + queue->last = entry->prev; + + free(entry); + } + + free(queue); +} + size_t skipstone_queue_count(skipstone_queue *queue) { return queue->count; } @@ -41,10 +53,14 @@ int skipstone_queue_push(skipstone_queue *queue, void *value) { next->value = value; next->next = NULL; - next->prev = NULL; + next->prev = queue->last; - queue->last->next = next; - queue->last = next; + if (queue->last) { + next->prev = queue->last; + queue->last->next = next; + } + + queue->last = next; return 0; @@ -59,6 +75,8 @@ int skipstone_queue_pop(skipstone_queue *queue, void **value) { return 0; } + *value = last->value; + queue->last = last->prev; free(last); diff --git a/src/queue.c-e b/src/queue.c-e index 6c6e39a..8935a29 100644 --- a/src/queue.c-e +++ b/src/queue.c-e @@ -28,6 +28,18 @@ error_malloc_queue: return NULL; } +void skipstone_queue_destroy(skipstone_queue *queue) { + while (queue->last) { + struct entry *entry = queue->last; + + queue->last = entry->prev; + + free(entry); + } + + free(queue); +} + size_t skipstone_queue_count(skipstone_queue *queue) { return queue->count; } @@ -41,10 +53,14 @@ int skipstone_queue_push(skipstone_queue *queue, void *value) { next->value = value; next->next = NULL; - next->prev = NULL; + next->prev = queue->last; - queue->last->next = next; - queue->last = next; + if (queue->last) { + next->prev = queue->last; + queue->last->next = next; + } + + queue->last = next; return 0; @@ -59,6 +75,8 @@ int skipstone_queue_pop(skipstone_queue *queue, void **value) { return 0; } + *value = last->value; + queue->last = last->prev; free(last);