Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <stdio.h>
- #include <stdlib.h>
- #include <memory.h>
- #include <Windows.h>
- typedef struct message_t {
- int messageId;
- void* data;
- }message;
- typedef struct node_t {
- struct node_t* next;
- struct message_t msg;
- }*node_ptr;
- typedef struct queue_t {
- node_ptr head;
- node_ptr tail;
- CRITICAL_SECTION cs;
- }*queue_ptr;
- queue_ptr queue_create() {
- queue_ptr p = (queue_ptr)malloc(sizeof(struct queue_t));
- p->head = p->tail = 0;
- InitializeCriticalSection(&p->cs);
- return p;
- }
- int queue_empty(queue_ptr queue) {
- return !queue->head && !queue->tail;
- }
- void queue_push(queue_ptr queue, message msg) {
- node_ptr p = (node_ptr)malloc(sizeof(struct node_t));
- p->next = 0;
- p->msg = msg;
- EnterCriticalSection(&queue->cs);
- if(queue_empty(queue)) {
- queue->head = p;
- queue->tail = p;
- } else {
- queue->tail->next = p;
- queue->tail = p;
- }
- LeaveCriticalSection(&queue->cs);
- }
- int queue_pop(queue_ptr queue, message* outMsg) {
- node_ptr p;
- EnterCriticalSection(&queue->cs);
- if(queue_empty(queue)) {
- LeaveCriticalSection(&queue->cs);
- return 0;
- }
- p = queue->head;
- queue->head = p->next;
- if(!p->next)
- queue->tail = p->next;
- *outMsg = p->msg;
- free(p);
- LeaveCriticalSection(&queue->cs);
- return 1;
- }
- //warning: ensure queue will not be referenced before calling.
- void queue_dump(queue_ptr queue) {
- message msg;
- while(queue_pop(queue, &msg));
- DeleteCriticalSection(&queue->cs);
- free(queue);
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement