OpenMAXBellagio 0.9.3
queue.c
Go to the documentation of this file.
00001 
00026 #include <stdio.h>
00027 #include <stdlib.h>
00028 #include <string.h>
00029 
00030 #include "queue.h"
00031 #include "omx_comp_debug_levels.h"
00032 
00038 int queue_init(queue_t* queue) {
00039   int i;
00040   qelem_t* newelem;
00041   qelem_t* current;
00042   i = pthread_mutex_init(&queue->mutex, NULL);
00043   if (i!=0) {
00044       return -1;
00045   }
00046   queue->first = malloc(sizeof(qelem_t));
00047   if (!(queue->first)) {
00048       return -1;
00049   }
00050   memset(queue->first, 0, sizeof(qelem_t));
00051   current = queue->last = queue->first;
00052   queue->nelem = 0;
00053   for (i = 0; i<MAX_QUEUE_ELEMENTS - 2; i++) {
00054     newelem = malloc(sizeof(qelem_t));
00055     if (!newelem) {
00056         // the memory is not enough. Free all
00057         while(queue->first!=NULL) {
00058             current = queue->first->q_forw;
00059             free(queue->first);
00060             queue->first = current;
00061         }
00062         return -1;
00063     }
00064     memset(newelem, 0, sizeof(qelem_t));
00065     current->q_forw = newelem;
00066     current = newelem;
00067   }
00068   current->q_forw = queue->first;
00069   return 0;
00070 }
00071 
00077 void queue_deinit(queue_t* queue) {
00078   int i;
00079   qelem_t* current;
00080   current = queue->first;
00081   for (i = 0; i<MAX_QUEUE_ELEMENTS - 2; i++) {
00082     if (current != NULL) {
00083       current = current->q_forw;
00084       free(queue->first);
00085       queue->first = current;
00086     }
00087   }
00088   if(queue->first) {
00089     free(queue->first);
00090     queue->first = NULL;
00091   }
00092   pthread_mutex_destroy(&queue->mutex);
00093 }
00094 
00103 int queue(queue_t* queue, void* data) {
00104   if (queue->last->data != NULL) {
00105     return -1;
00106   }
00107   pthread_mutex_lock(&queue->mutex);
00108   queue->last->data = data;
00109   queue->last = queue->last->q_forw;
00110   queue->nelem++;
00111   pthread_mutex_unlock(&queue->mutex);
00112   return 0;
00113 }
00114 
00122 void* dequeue(queue_t* queue) {
00123   void* data;
00124   if (queue->first->data == NULL) {
00125     return NULL;
00126   }
00127   pthread_mutex_lock(&queue->mutex);
00128   data = queue->first->data;
00129   queue->first->data = NULL;
00130   queue->first = queue->first->q_forw;
00131   queue->nelem--;
00132   pthread_mutex_unlock(&queue->mutex);
00133 
00134   return data;
00135 }
00136 
00143 int getquenelem(queue_t* queue) {
00144   int qelem;
00145   pthread_mutex_lock(&queue->mutex);
00146   qelem = queue->nelem;
00147   pthread_mutex_unlock(&queue->mutex);
00148   return qelem;
00149 }