cubeb_array_queue.h (1888B)
1 /* 2 * Copyright © 2016 Mozilla Foundation 3 * 4 * This program is made available under an ISC-style license. See the 5 * accompanying file LICENSE for details. 6 */ 7 8 #ifndef CUBEB_ARRAY_QUEUE_H 9 #define CUBEB_ARRAY_QUEUE_H 10 11 #include <assert.h> 12 #include <pthread.h> 13 #include <unistd.h> 14 15 #if defined(__cplusplus) 16 extern "C" { 17 #endif 18 19 typedef struct { 20 void ** buf; 21 size_t num; 22 size_t writePos; 23 size_t readPos; 24 pthread_mutex_t mutex; 25 } array_queue; 26 27 array_queue * 28 array_queue_create(size_t num) 29 { 30 assert(num != 0); 31 array_queue * new_queue = (array_queue *)calloc(1, sizeof(array_queue)); 32 new_queue->buf = (void **)calloc(1, sizeof(void *) * num); 33 new_queue->readPos = 0; 34 new_queue->writePos = 0; 35 new_queue->num = num; 36 37 pthread_mutex_init(&new_queue->mutex, NULL); 38 39 return new_queue; 40 } 41 42 void 43 array_queue_destroy(array_queue * aq) 44 { 45 assert(aq); 46 47 free(aq->buf); 48 pthread_mutex_destroy(&aq->mutex); 49 free(aq); 50 } 51 52 int 53 array_queue_push(array_queue * aq, void * item) 54 { 55 assert(item); 56 57 pthread_mutex_lock(&aq->mutex); 58 int ret = -1; 59 if (aq->buf[aq->writePos % aq->num] == NULL) { 60 aq->buf[aq->writePos % aq->num] = item; 61 aq->writePos = (aq->writePos + 1) % aq->num; 62 ret = 0; 63 } 64 // else queue is full 65 pthread_mutex_unlock(&aq->mutex); 66 return ret; 67 } 68 69 void * 70 array_queue_pop(array_queue * aq) 71 { 72 pthread_mutex_lock(&aq->mutex); 73 void * value = aq->buf[aq->readPos % aq->num]; 74 if (value) { 75 aq->buf[aq->readPos % aq->num] = NULL; 76 aq->readPos = (aq->readPos + 1) % aq->num; 77 } 78 pthread_mutex_unlock(&aq->mutex); 79 return value; 80 } 81 82 size_t 83 array_queue_get_size(array_queue * aq) 84 { 85 pthread_mutex_lock(&aq->mutex); 86 ssize_t r = aq->writePos - aq->readPos; 87 if (r < 0) { 88 r = aq->num + r; 89 assert(r >= 0); 90 } 91 pthread_mutex_unlock(&aq->mutex); 92 return (size_t)r; 93 } 94 95 #if defined(__cplusplus) 96 } 97 #endif 98 99 #endif // CUBE_ARRAY_QUEUE_H