gpointer *array;
volatile gint head;
volatile gint tail;
+ volatile gint tail_read;
GstAQueueMem *next;
GstAQueueMem *free;
};
mem->array = g_new0 (gpointer, mem->size + 1);
mem->head = pos;
mem->tail = pos;
+ mem->tail_read = pos;
mem->next = NULL;
mem->free = NULL;
head_mem = g_atomic_pointer_get (&queue->head_mem);
head = g_atomic_int_get (&head_mem->head);
- tail = g_atomic_int_get (&head_mem->tail);
+ tail = g_atomic_int_get (&head_mem->tail_read);
size = head_mem->size;
/* when we are not empty, we can continue */
head_mem = g_atomic_pointer_get (&queue->head_mem);
head = g_atomic_int_get (&head_mem->head);
- tail = g_atomic_int_get (&head_mem->tail);
+ tail = g_atomic_int_get (&head_mem->tail_read);
size = head_mem->size;
/* when we are not empty, we can continue */
tail + 1));
tail_mem->array[tail & size] = data;
+
+ /* and now the readers can read */
+ g_atomic_int_inc (&tail_mem->tail_read);
}
/**
head = g_atomic_int_get (&head_mem->head);
tail_mem = g_atomic_pointer_get (&queue->tail_mem);
- tail = g_atomic_int_get (&tail_mem->tail);
+ tail = g_atomic_int_get (&tail_mem->tail_read);
#ifdef LOW_MEM
if (g_atomic_int_dec_and_test (&queue->num_readers))