diff --git a/examples/queue.c b/examples/queue.c index 1e139f2..62cd509 100644 --- a/examples/queue.c +++ b/examples/queue.c @@ -15,7 +15,7 @@ int main(int argc, char **argv) { } skipstone_queue_push(queue, "poop"); - skipstone_queue_pop(queue, &message); + skipstone_queue_pop(queue, (void **)&message); printf("%s\n", message); diff --git a/examples/queue.c-e b/examples/queue.c-e index 1e139f2..62cd509 100644 --- a/examples/queue.c-e +++ b/examples/queue.c-e @@ -15,7 +15,7 @@ int main(int argc, char **argv) { } skipstone_queue_push(queue, "poop"); - skipstone_queue_pop(queue, &message); + skipstone_queue_pop(queue, (void **)&message); printf("%s\n", message); diff --git a/include/skipstone/queue.h b/include/skipstone/queue.h index c5b15d6..22bad44 100644 --- a/include/skipstone/queue.h +++ b/include/skipstone/queue.h @@ -9,9 +9,9 @@ skipstone_queue *skipstone_queue_new(); size_t skipstone_queue_count(skipstone_queue *queue); -int skipstone_queue_push(skipstone_queue *queue, void *value); +int skipstone_queue_add(skipstone_queue *queue, void *value); -int skipstone_queue_pop(skipstone_queue *queue, void **value); +int skipstone_queue_remove(skipstone_queue *queue, void **value); void skipstone_queue_destroy(skipstone_queue *queue); diff --git a/src/message.c b/src/message.c index 63b08d7..73cc6cb 100644 --- a/src/message.c +++ b/src/message.c @@ -79,13 +79,13 @@ int skipstone_message_service_queue(skipstone_message_service *service, memcpy(message + 1, buf, size); - if (skipstone_queue_push(service->pending, message) < 0) { - goto error_queue_push_pending; + if (skipstone_queue_add(service->pending, message) < 0) { + goto error_queue_add_pending; } return 0; -error_queue_push_pending: +error_queue_add_pending: free(message); error_malloc_message: @@ -117,7 +117,7 @@ int skipstone_message_service_run(skipstone_message_service *service, } } - while (skipstone_queue_pop(service->pending, (void **)&message)) { + while (skipstone_queue_remove(service->pending, (void **)&message)) { printf("Sending message %hu\n", message->id); if (skipstone_link_send(link, message + 1, message->size, message->id) < 0) { goto error_io; diff --git a/src/message.c-e b/src/message.c-e index 63b08d7..73cc6cb 100644 --- a/src/message.c-e +++ b/src/message.c-e @@ -79,13 +79,13 @@ int skipstone_message_service_queue(skipstone_message_service *service, memcpy(message + 1, buf, size); - if (skipstone_queue_push(service->pending, message) < 0) { - goto error_queue_push_pending; + if (skipstone_queue_add(service->pending, message) < 0) { + goto error_queue_add_pending; } return 0; -error_queue_push_pending: +error_queue_add_pending: free(message); error_malloc_message: @@ -117,7 +117,7 @@ int skipstone_message_service_run(skipstone_message_service *service, } } - while (skipstone_queue_pop(service->pending, (void **)&message)) { + while (skipstone_queue_remove(service->pending, (void **)&message)) { printf("Sending message %hu\n", message->id); if (skipstone_link_send(link, message + 1, message->size, message->id) < 0) { goto error_io; diff --git a/src/queue.c b/src/queue.c index aef0dfe..f0b4de6 100644 --- a/src/queue.c +++ b/src/queue.c @@ -9,7 +9,7 @@ struct entry { struct _skipstone_queue { size_t count; - struct entry *last; + struct entry *first, *last; }; skipstone_queue *skipstone_queue_new() { @@ -20,6 +20,7 @@ skipstone_queue *skipstone_queue_new() { } queue->count = 0; + queue->first = NULL; queue->last = NULL; return queue; @@ -44,7 +45,7 @@ size_t skipstone_queue_count(skipstone_queue *queue) { return queue->count; } -int skipstone_queue_push(skipstone_queue *queue, void *value) { +int skipstone_queue_add(skipstone_queue *queue, void *value) { struct entry *next; if ((next = malloc(sizeof(*next))) == NULL) { @@ -55,6 +56,10 @@ int skipstone_queue_push(skipstone_queue *queue, void *value) { next->next = NULL; next->prev = queue->last; + if (queue->first == NULL) { + queue->first = next; + } + if (queue->last) { next->prev = queue->last; queue->last->next = next; @@ -69,18 +74,18 @@ error_malloc_next: return -1; } -int skipstone_queue_pop(skipstone_queue *queue, void **value) { - struct entry *last = queue->last; +int skipstone_queue_remove(skipstone_queue *queue, void **value) { + struct entry *first = queue->first; if (queue->count == 0) { return 0; } - *value = last->value; - queue->last = last->prev; + *value = first->value; + queue->first = first->next; queue->count--; - free(last); + free(first); return 1; } diff --git a/src/queue.c-e b/src/queue.c-e index aef0dfe..f0b4de6 100644 --- a/src/queue.c-e +++ b/src/queue.c-e @@ -9,7 +9,7 @@ struct entry { struct _skipstone_queue { size_t count; - struct entry *last; + struct entry *first, *last; }; skipstone_queue *skipstone_queue_new() { @@ -20,6 +20,7 @@ skipstone_queue *skipstone_queue_new() { } queue->count = 0; + queue->first = NULL; queue->last = NULL; return queue; @@ -44,7 +45,7 @@ size_t skipstone_queue_count(skipstone_queue *queue) { return queue->count; } -int skipstone_queue_push(skipstone_queue *queue, void *value) { +int skipstone_queue_add(skipstone_queue *queue, void *value) { struct entry *next; if ((next = malloc(sizeof(*next))) == NULL) { @@ -55,6 +56,10 @@ int skipstone_queue_push(skipstone_queue *queue, void *value) { next->next = NULL; next->prev = queue->last; + if (queue->first == NULL) { + queue->first = next; + } + if (queue->last) { next->prev = queue->last; queue->last->next = next; @@ -69,18 +74,18 @@ error_malloc_next: return -1; } -int skipstone_queue_pop(skipstone_queue *queue, void **value) { - struct entry *last = queue->last; +int skipstone_queue_remove(skipstone_queue *queue, void **value) { + struct entry *first = queue->first; if (queue->count == 0) { return 0; } - *value = last->value; - queue->last = last->prev; + *value = first->value; + queue->first = first->next; queue->count--; - free(last); + free(first); return 1; }