1 #include <media_codec_queue.h>
4 async_queue_t *mc_async_queue_new(void)
6 async_queue_t *async_queue;
8 async_queue = g_slice_new0(async_queue_t);
9 if (async_queue == NULL) {
10 LOGE("async_queue initialization failed");
14 g_cond_init(&async_queue->condition);
15 g_mutex_init(&async_queue->mutex);
16 async_queue->enabled = TRUE;
21 void mc_async_queue_free(async_queue_t *async_queue)
23 g_cond_clear(&async_queue->condition);
24 g_mutex_clear(&async_queue->mutex);
26 g_list_free(async_queue->head);
27 g_slice_free(async_queue_t, async_queue);
30 void mc_async_queue_push(async_queue_t *async_queue, gpointer data)
32 g_mutex_lock(&async_queue->mutex);
34 async_queue->tail = g_list_append(async_queue->tail, data);
35 if (async_queue->tail->next)
36 async_queue->tail = async_queue->tail->next;
38 async_queue->head = async_queue->tail;
40 async_queue->length++;
42 g_cond_signal(&async_queue->condition);
43 /*LOGD("queue pushed : %p, %d, %p",queue, async_queue->length, data);*/
45 g_mutex_unlock(&async_queue->mutex);
48 gpointer mc_async_queue_pop(async_queue_t *async_queue)
52 g_mutex_lock(&async_queue->mutex);
54 if (!async_queue->enabled) {
55 /* g_warning ("not enabled!"); */
59 if (!async_queue->head)
60 g_cond_wait(&async_queue->condition, &async_queue->mutex);
62 if (async_queue->head) {
63 GList *node = async_queue->head;
66 async_queue->head = node->next;
68 if (async_queue->head)
69 async_queue->head->prev = NULL;
71 async_queue->tail = NULL;
72 async_queue->length--;
73 /*LOGD("async queue poped : %p, %d, %p",queue, async_queue->length, data);*/
78 g_mutex_unlock(&async_queue->mutex);
84 gpointer mc_async_queue_pop_forced(async_queue_t *async_queue)
88 g_mutex_lock(&async_queue->mutex);
90 if (async_queue->head) {
91 GList *node = async_queue->head;
94 async_queue->head = node->next;
95 if (async_queue->head)
96 async_queue->head->prev = NULL;
98 async_queue->tail = NULL;
99 async_queue->length--;
100 /*LOGD("async queue poped : %p, %d, %p",queue, async_queue->length, data);*/
104 g_mutex_unlock(&async_queue->mutex);
110 void mc_async_queue_disable(async_queue_t *async_queue)
112 g_mutex_lock(&async_queue->mutex);
113 async_queue->enabled = FALSE;
114 g_cond_broadcast(&async_queue->condition);
115 g_mutex_unlock(&async_queue->mutex);
118 void mc_async_queue_flush(async_queue_t *async_queue)
120 g_mutex_lock(&async_queue->mutex);
122 g_list_free(async_queue->head);
123 async_queue->head = async_queue->tail = NULL;
124 async_queue->length = 0;
126 g_mutex_unlock(&async_queue->mutex);
129 gboolean mc_async_queue_is_empty(async_queue_t *async_queue)
131 return async_queue->head == NULL;