Advertisement
Guest User

Untitled

a guest
Jun 23rd, 2017
52
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 1.46 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <memory.h>
  4. #include <Windows.h>
  5.  
  6. typedef struct message_t {
  7.     int messageId;
  8.     void* data;
  9. }message;
  10.  
  11. typedef struct node_t {
  12.     struct node_t* next;
  13.     struct message_t msg;
  14. }*node_ptr;
  15.  
  16. typedef struct queue_t {
  17.     node_ptr head;
  18.     node_ptr tail;
  19.     CRITICAL_SECTION cs;
  20. }*queue_ptr;
  21.  
  22. queue_ptr queue_create() {
  23.     queue_ptr p = (queue_ptr)malloc(sizeof(struct queue_t));
  24.     p->head = p->tail = 0;
  25.     InitializeCriticalSection(&p->cs);
  26.     return p;
  27. }
  28.  
  29. int queue_empty(queue_ptr queue) {
  30.     return !queue->head && !queue->tail;
  31. }
  32.  
  33. void queue_push(queue_ptr queue, message msg) {
  34.     node_ptr p = (node_ptr)malloc(sizeof(struct node_t));
  35.     p->next = 0;
  36.     p->msg = msg;
  37.  
  38.     EnterCriticalSection(&queue->cs);
  39.     if(queue_empty(queue)) {
  40.         queue->head = p;
  41.         queue->tail = p;
  42.     } else {
  43.         queue->tail->next = p;
  44.         queue->tail = p;
  45.     }
  46.     LeaveCriticalSection(&queue->cs);
  47. }
  48.  
  49. int queue_pop(queue_ptr queue, message* outMsg) {
  50.     node_ptr p;
  51.     EnterCriticalSection(&queue->cs);
  52.     if(queue_empty(queue)) {
  53.         LeaveCriticalSection(&queue->cs);
  54.         return 0;
  55.     }
  56.  
  57.     p = queue->head;
  58.     queue->head = p->next;
  59.  
  60.     if(!p->next)
  61.         queue->tail = p->next;
  62.  
  63.     *outMsg = p->msg;
  64.     free(p);
  65.     LeaveCriticalSection(&queue->cs);
  66.     return 1;
  67. }
  68.  
  69. //warning: ensure queue will not be referenced before calling.
  70. void queue_dump(queue_ptr queue) {
  71.     message msg;
  72.     while(queue_pop(queue, &msg));
  73.     DeleteCriticalSection(&queue->cs);
  74.     free(queue);
  75. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement