00001 00029 #include <stdio.h> 00030 #include <stdlib.h> 00031 #include <string.h> 00032 00033 #include "queue.h" 00034 #include "omx_comp_debug_levels.h" 00035 00041 void queue_init(queue_t* queue) { 00042 int i; 00043 qelem_t* newelem; 00044 qelem_t* current; 00045 queue->first = malloc(sizeof(qelem_t)); 00046 memset(queue->first, 0, sizeof(qelem_t)); 00047 current = queue->last = queue->first; 00048 queue->nelem = 0; 00049 for (i = 0; i<MAX_QUEUE_ELEMENTS - 2; i++) { 00050 newelem = malloc(sizeof(qelem_t)); 00051 memset(newelem, 0, sizeof(qelem_t)); 00052 current->q_forw = newelem; 00053 current = newelem; 00054 } 00055 current->q_forw = queue->first; 00056 00057 pthread_mutex_init(&queue->mutex, NULL); 00058 } 00059 00065 void queue_deinit(queue_t* queue) { 00066 int i; 00067 qelem_t* current; 00068 current = queue->first; 00069 for (i = 0; i<MAX_QUEUE_ELEMENTS - 2; i++) { 00070 if (current != NULL) { 00071 current = current->q_forw; 00072 free(queue->first); 00073 queue->first = current; 00074 } 00075 } 00076 if(queue->first) { 00077 free(queue->first); 00078 queue->first = NULL; 00079 } 00080 pthread_mutex_destroy(&queue->mutex); 00081 } 00082 00089 void queue(queue_t* queue, void* data) { 00090 if (queue->last->data != NULL) { 00091 return; 00092 } 00093 pthread_mutex_lock(&queue->mutex); 00094 queue->last->data = data; 00095 queue->last = queue->last->q_forw; 00096 queue->nelem++; 00097 pthread_mutex_unlock(&queue->mutex); 00098 } 00099 00107 void* dequeue(queue_t* queue) { 00108 void* data; 00109 if (queue->first->data == NULL) { 00110 return NULL; 00111 } 00112 pthread_mutex_lock(&queue->mutex); 00113 data = queue->first->data; 00114 queue->first->data = NULL; 00115 queue->first = queue->first->q_forw; 00116 queue->nelem--; 00117 pthread_mutex_unlock(&queue->mutex); 00118 00119 return data; 00120 } 00121 00128 int getquenelem(queue_t* queue) { 00129 int qelem; 00130 pthread_mutex_lock(&queue->mutex); 00131 qelem = queue->nelem; 00132 pthread_mutex_unlock(&queue->mutex); 00133 return qelem; 00134 }