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_push(queue, "poop");
|
||||||
skipstone_queue_pop(queue, &message);
|
skipstone_queue_pop(queue, (void **)&message);
|
||||||
|
|
||||||
printf("%s\n", message);
|
printf("%s\n", message);
|
||||||
|
|
||||||
|
|
|
@ -15,7 +15,7 @@ int main(int argc, char **argv) {
|
||||||
}
|
}
|
||||||
|
|
||||||
skipstone_queue_push(queue, "poop");
|
skipstone_queue_push(queue, "poop");
|
||||||
skipstone_queue_pop(queue, &message);
|
skipstone_queue_pop(queue, (void **)&message);
|
||||||
|
|
||||||
printf("%s\n", message);
|
printf("%s\n", message);
|
||||||
|
|
||||||
|
|
|
@ -9,9 +9,9 @@ skipstone_queue *skipstone_queue_new();
|
||||||
|
|
||||||
size_t skipstone_queue_count(skipstone_queue *queue);
|
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);
|
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);
|
memcpy(message + 1, buf, size);
|
||||||
|
|
||||||
if (skipstone_queue_push(service->pending, message) < 0) {
|
if (skipstone_queue_add(service->pending, message) < 0) {
|
||||||
goto error_queue_push_pending;
|
goto error_queue_add_pending;
|
||||||
}
|
}
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
error_queue_push_pending:
|
error_queue_add_pending:
|
||||||
free(message);
|
free(message);
|
||||||
|
|
||||||
error_malloc_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);
|
printf("Sending message %hu\n", message->id);
|
||||||
if (skipstone_link_send(link, message + 1, message->size, message->id) < 0) {
|
if (skipstone_link_send(link, message + 1, message->size, message->id) < 0) {
|
||||||
goto error_io;
|
goto error_io;
|
||||||
|
|
|
@ -79,13 +79,13 @@ int skipstone_message_service_queue(skipstone_message_service *service,
|
||||||
|
|
||||||
memcpy(message + 1, buf, size);
|
memcpy(message + 1, buf, size);
|
||||||
|
|
||||||
if (skipstone_queue_push(service->pending, message) < 0) {
|
if (skipstone_queue_add(service->pending, message) < 0) {
|
||||||
goto error_queue_push_pending;
|
goto error_queue_add_pending;
|
||||||
}
|
}
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
error_queue_push_pending:
|
error_queue_add_pending:
|
||||||
free(message);
|
free(message);
|
||||||
|
|
||||||
error_malloc_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);
|
printf("Sending message %hu\n", message->id);
|
||||||
if (skipstone_link_send(link, message + 1, message->size, message->id) < 0) {
|
if (skipstone_link_send(link, message + 1, message->size, message->id) < 0) {
|
||||||
goto error_io;
|
goto error_io;
|
||||||
|
|
19
src/queue.c
19
src/queue.c
|
@ -9,7 +9,7 @@ struct entry {
|
||||||
|
|
||||||
struct _skipstone_queue {
|
struct _skipstone_queue {
|
||||||
size_t count;
|
size_t count;
|
||||||
struct entry *last;
|
struct entry *first, *last;
|
||||||
};
|
};
|
||||||
|
|
||||||
skipstone_queue *skipstone_queue_new() {
|
skipstone_queue *skipstone_queue_new() {
|
||||||
|
@ -20,6 +20,7 @@ skipstone_queue *skipstone_queue_new() {
|
||||||
}
|
}
|
||||||
|
|
||||||
queue->count = 0;
|
queue->count = 0;
|
||||||
|
queue->first = NULL;
|
||||||
queue->last = NULL;
|
queue->last = NULL;
|
||||||
|
|
||||||
return queue;
|
return queue;
|
||||||
|
@ -44,7 +45,7 @@ size_t skipstone_queue_count(skipstone_queue *queue) {
|
||||||
return queue->count;
|
return queue->count;
|
||||||
}
|
}
|
||||||
|
|
||||||
int skipstone_queue_push(skipstone_queue *queue, void *value) {
|
int skipstone_queue_add(skipstone_queue *queue, void *value) {
|
||||||
struct entry *next;
|
struct entry *next;
|
||||||
|
|
||||||
if ((next = malloc(sizeof(*next))) == NULL) {
|
if ((next = malloc(sizeof(*next))) == NULL) {
|
||||||
|
@ -55,6 +56,10 @@ int skipstone_queue_push(skipstone_queue *queue, void *value) {
|
||||||
next->next = NULL;
|
next->next = NULL;
|
||||||
next->prev = queue->last;
|
next->prev = queue->last;
|
||||||
|
|
||||||
|
if (queue->first == NULL) {
|
||||||
|
queue->first = next;
|
||||||
|
}
|
||||||
|
|
||||||
if (queue->last) {
|
if (queue->last) {
|
||||||
next->prev = queue->last;
|
next->prev = queue->last;
|
||||||
queue->last->next = next;
|
queue->last->next = next;
|
||||||
|
@ -69,18 +74,18 @@ error_malloc_next:
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
int skipstone_queue_pop(skipstone_queue *queue, void **value) {
|
int skipstone_queue_remove(skipstone_queue *queue, void **value) {
|
||||||
struct entry *last = queue->last;
|
struct entry *first = queue->first;
|
||||||
|
|
||||||
if (queue->count == 0) {
|
if (queue->count == 0) {
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
*value = last->value;
|
*value = first->value;
|
||||||
queue->last = last->prev;
|
queue->first = first->next;
|
||||||
queue->count--;
|
queue->count--;
|
||||||
|
|
||||||
free(last);
|
free(first);
|
||||||
|
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
|
@ -9,7 +9,7 @@ struct entry {
|
||||||
|
|
||||||
struct _skipstone_queue {
|
struct _skipstone_queue {
|
||||||
size_t count;
|
size_t count;
|
||||||
struct entry *last;
|
struct entry *first, *last;
|
||||||
};
|
};
|
||||||
|
|
||||||
skipstone_queue *skipstone_queue_new() {
|
skipstone_queue *skipstone_queue_new() {
|
||||||
|
@ -20,6 +20,7 @@ skipstone_queue *skipstone_queue_new() {
|
||||||
}
|
}
|
||||||
|
|
||||||
queue->count = 0;
|
queue->count = 0;
|
||||||
|
queue->first = NULL;
|
||||||
queue->last = NULL;
|
queue->last = NULL;
|
||||||
|
|
||||||
return queue;
|
return queue;
|
||||||
|
@ -44,7 +45,7 @@ size_t skipstone_queue_count(skipstone_queue *queue) {
|
||||||
return queue->count;
|
return queue->count;
|
||||||
}
|
}
|
||||||
|
|
||||||
int skipstone_queue_push(skipstone_queue *queue, void *value) {
|
int skipstone_queue_add(skipstone_queue *queue, void *value) {
|
||||||
struct entry *next;
|
struct entry *next;
|
||||||
|
|
||||||
if ((next = malloc(sizeof(*next))) == NULL) {
|
if ((next = malloc(sizeof(*next))) == NULL) {
|
||||||
|
@ -55,6 +56,10 @@ int skipstone_queue_push(skipstone_queue *queue, void *value) {
|
||||||
next->next = NULL;
|
next->next = NULL;
|
||||||
next->prev = queue->last;
|
next->prev = queue->last;
|
||||||
|
|
||||||
|
if (queue->first == NULL) {
|
||||||
|
queue->first = next;
|
||||||
|
}
|
||||||
|
|
||||||
if (queue->last) {
|
if (queue->last) {
|
||||||
next->prev = queue->last;
|
next->prev = queue->last;
|
||||||
queue->last->next = next;
|
queue->last->next = next;
|
||||||
|
@ -69,18 +74,18 @@ error_malloc_next:
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
int skipstone_queue_pop(skipstone_queue *queue, void **value) {
|
int skipstone_queue_remove(skipstone_queue *queue, void **value) {
|
||||||
struct entry *last = queue->last;
|
struct entry *first = queue->first;
|
||||||
|
|
||||||
if (queue->count == 0) {
|
if (queue->count == 0) {
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
*value = last->value;
|
*value = first->value;
|
||||||
queue->last = last->prev;
|
queue->first = first->next;
|
||||||
queue->count--;
|
queue->count--;
|
||||||
|
|
||||||
free(last);
|
free(first);
|
||||||
|
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Reference in a new issue