efl/src/lib/ecore_buffer/buffer_queue.c

154 lines
3.1 KiB
C

#include "buffer_queue.h"
struct _Ecore_Buffer_Queue
{
int w, h;
Eina_List *shared_buffers;
Eina_Bool connected;
struct
{
unsigned int capacity;
Eina_List *list;
} queue;
};
static Eina_Bool
_queue_is_full(Ecore_Buffer_Queue *ebq)
{
return (eina_list_count(ebq->queue.list) == ebq->queue.capacity);
}
static Eina_Bool
_queue_is_empty(Ecore_Buffer_Queue *ebq)
{
return (eina_list_count(ebq->queue.list) == 0);
}
Ecore_Buffer_Queue *
_ecore_buffer_queue_new(int w, int h, int queue_size)
{
Ecore_Buffer_Queue *ebq;
if (queue_size < 1) return NULL;
ebq = calloc(1, sizeof(Ecore_Buffer_Queue));
if (!ebq)
return NULL;
ebq->w = w;
ebq->h = h;
ebq->queue.capacity = queue_size;
return ebq;
}
void
_ecore_buffer_queue_free(Ecore_Buffer_Queue *ebq)
{
if (!ebq) return;
if (ebq->shared_buffers) eina_list_free(ebq->shared_buffers);
if (ebq->queue.list) eina_list_free(ebq->queue.list);
free(ebq);
}
void
_ecore_buffer_queue_enqueue(Ecore_Buffer_Queue *ebq, Shared_Buffer *sb)
{
if (!ebq) return;
if (_queue_is_full(ebq)) return;
if (!eina_list_data_find(ebq->shared_buffers, sb))
{
WARN("Couldn't enqueue not shared buffer.");
return;
}
ebq->queue.list = eina_list_prepend(ebq->queue.list, sb);
}
Eina_Bool
_ecore_buffer_queue_dequeue(Ecore_Buffer_Queue *ebq, Shared_Buffer **ret_sb)
{
Eina_List *last;
Shared_Buffer *sb;
if (!ebq) return EINA_FALSE;
if (_queue_is_empty(ebq)) return EINA_FALSE;
sb = eina_list_last_data_get(ebq->queue.list);
last = eina_list_last(ebq->queue.list);
ebq->queue.list = eina_list_remove_list(ebq->queue.list, last);
if (ret_sb) *ret_sb = sb;
return EINA_TRUE;
}
Eina_Bool
_ecore_buffer_queue_is_empty(Ecore_Buffer_Queue *ebq)
{
if (!ebq) return EINA_FALSE;
return _queue_is_empty(ebq);
}
void
_ecore_buffer_queue_shared_buffer_add(Ecore_Buffer_Queue *ebq, Shared_Buffer *sb)
{
if (!ebq) return;
ebq->shared_buffers = eina_list_append(ebq->shared_buffers, sb);
}
void
_ecore_buffer_queue_shared_buffer_remove(Ecore_Buffer_Queue *ebq, Shared_Buffer *sb)
{
if (!ebq) return;
ebq->shared_buffers = eina_list_remove(ebq->shared_buffers, sb);
while (eina_list_data_find(ebq->queue.list, sb) != NULL)
ebq->queue.list = eina_list_remove(ebq->queue.list, sb);
}
Shared_Buffer *
_ecore_buffer_queue_shared_buffer_find(Ecore_Buffer_Queue *ebq, Ecore_Buffer *buffer)
{
Eina_List *l;
Shared_Buffer *sb;
if (!ebq) return NULL;
EINA_LIST_FOREACH(ebq->shared_buffers, l, sb)
{
if (_shared_buffer_buffer_get(sb) == buffer)
return sb;
}
return NULL;
}
Eina_List *
_ecore_buffer_queue_shared_buffer_list_get(Ecore_Buffer_Queue *ebq)
{
if (!ebq) return NULL;
return ebq->shared_buffers;
}
void
_ecore_buffer_queue_connection_state_set(Ecore_Buffer_Queue *ebq, Eina_Bool connect)
{
if (!ebq) return;
ebq->connected = connect;
}
Eina_Bool
_ecore_buffer_queue_connection_state_get(Ecore_Buffer_Queue *ebq)
{
if (!ebq) return EINA_FALSE;
return ebq->connected;
}