Guest User

Untitled

a guest
Jul 17th, 2018
88
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.15 KB | None | 0 0
  1. #pragma once
  2. #include <stdlib.h>
  3.  
  4. typedef struct Node {
  5. void* data;
  6. struct Node* next;
  7. } lfq_node_t;
  8.  
  9. typedef struct Queue {
  10. lfq_node_t* head;
  11. lfq_node_t* tail;
  12. } lfq_t;
  13.  
  14. lfq_t* lfq_new();
  15. void lfq_free(lfq_t* q);
  16. void lfq_enq(lfq_t* q, void* data);
  17. void* lfq_deq(lfq_t* q);
  18.  
  19. #include "lfq.h"
  20. #include <pthread.h>
  21. #include <stdio.h>
  22.  
  23. #define CAS(a, b, c) __sync_bool_compare_and_swap(a, b, c)
  24.  
  25. lfq_t* lfq_new() {
  26. lfq_t* q = malloc(sizeof(*q));
  27. lfq_node_t* sentinel = malloc(sizeof(*sentinel));
  28. sentinel->data = sentinel->next = NULL;
  29. q->head = q->tail = sentinel;
  30.  
  31. return q;
  32. }
  33.  
  34. void lfq_free(lfq_t* q) {
  35. lfq_node_t *next, *node = q->head;
  36. while (node != NULL) {
  37. next = node->next;
  38. free(node);
  39. node = next;
  40. }
  41. free(q);
  42. }
  43.  
  44. void lfq_enq(lfq_t* q, void* data) {
  45. lfq_node_t *node, *last, *next;
  46.  
  47. node = malloc(sizeof(*node));
  48. node->data = data;
  49. node->next = NULL;
  50.  
  51. while (1) {
  52. last = q->tail;
  53. next = last->next;
  54. if (last == q->tail) {
  55. if (next == NULL) {
  56. if (CAS(&(last->next), next, node)) {
  57. CAS(&(q->tail), last, node);
  58. return;
  59. }
  60. } else {
  61. CAS(&(q->tail), last, next);
  62. }
  63. }
  64. }
  65. }
  66.  
  67. void* lfq_deq(lfq_t* q) {
  68. lfq_node_t *first, *last, *next;
  69. while (1) {
  70. first = q->head;
  71. last = q->tail;
  72. next = first->next;
  73.  
  74. if (first == q->head) {
  75. if (first == last) {
  76. if (next == NULL) return NULL;
  77. CAS(&(q->tail), last, next);
  78. } else {
  79. void* data = first->next->data;
  80. if (CAS(&(q->head), first, next)) {
  81. // free(first);
  82. return data;
  83. }
  84. }
  85. }
  86. }
  87. }
  88.  
  89. #include "lfq.h"
  90. #include <stdio.h>
  91.  
  92. int main() {
  93. int values[] = {1, 2, 3, 4, 5};
  94. lfq_t* q = lfq_new();
  95. for (int i = 0; i < 5; ++i) {
  96. printf("ENQ %in", values[i]);
  97. lfq_enq(q, &values[i]);
  98. }
  99. for (int i = 0; i < 5; ++i) printf("DEQ %in", *(int*)lfq_deq(q));
  100.  
  101. return 0;
  102. }
Add Comment
Please, Sign In to add comment