|
OpenMAXBellagio 0.9.3
|
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 }