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 }