tor-browser

The Tor Browser
git clone https://git.dasho.dev/tor-browser.git
Log | Files | Refs | README | LICENSE

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