gotta work dat queue the other way
This commit is contained in:
parent
a6e50b93e1
commit
c11fe005b3
7 changed files with 36 additions and 26 deletions
|
@ -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);
|
||||
|
||||
|
|
|
@ -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);
|
||||
|
||||
|
|
|
@ -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);
|
||||
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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;
|
||||
|
|
19
src/queue.c
19
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;
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
Loading…
Add table
Reference in a new issue