From 8b9d31ef902b80c27065ab542c4783d6194f420f Mon Sep 17 00:00:00 2001 From: inmarket Date: Thu, 20 Mar 2014 23:33:32 +1000 Subject: Move queued buffer code from gaudio into gqueue --- src/gqueue/gqueue.c | 56 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 56 insertions(+) (limited to 'src/gqueue/gqueue.c') diff --git a/src/gqueue/gqueue.c b/src/gqueue/gqueue.c index b7ecb032..1b2d4618 100644 --- a/src/gqueue/gqueue.c +++ b/src/gqueue/gqueue.c @@ -14,6 +14,21 @@ #if GFX_USE_GQUEUE +#if GQUEUE_NEED_BUFFERS + static gfxQueueGSync bufferFreeList; +#endif + +void _gqueueInit(void) +{ + #if GQUEUE_NEED_BUFFERS + gfxQueueGSyncInit(&bufferFreeList); + #endif +} + +void _gqueueDeinit(void) +{ +} + #if GQUEUE_NEED_ASYNC void gfxQueueASyncInit(gfxQueueASync *pqueue) { pqueue->head = pqueue->tail = 0; @@ -123,6 +138,10 @@ pqueue->head = pqueue->tail = 0; gfxSemInit(&pqueue->sem, 0, MAX_SEMAPHORE_COUNT); } + void gfxQueueGSyncDeinit(gfxQueueGSync *pqueue) { + pqueue->head = pqueue->tail = 0; + gfxSemDestroy(&pqueue->sem); + } gfxQueueGSyncItem *gfxQueueGSyncGet(gfxQueueGSync *pqueue, delaytime_t ms) { gfxQueueGSyncItem *pi; @@ -232,6 +251,11 @@ pqueue->head = pqueue->tail = 0; gfxSemInit(&pqueue->sem, 0, MAX_SEMAPHORE_COUNT); } + void gfxQueueFSyncDeinit(gfxQueueGSync *pqueue) { + while(gfxQueueFSyncGet(pqueue, TIME_IMMEDIATE)); + pqueue->head = pqueue->tail = 0; + gfxSemDestroy(&pqueue->sem); + } gfxQueueFSyncItem *gfxQueueFSyncGet(gfxQueueFSync *pqueue, delaytime_t ms) { gfxQueueFSyncItem *pi; @@ -333,4 +357,36 @@ } #endif +#if GQUEUE_NEED_BUFFERS + bool_t gfxBufferAlloc(unsigned num, size_t size) { + GDataBuffer *pd; + + if (num < 1) + return FALSE; + + // Round up to a multiple of 4 to prevent problems with structure alignment + size = (size + 3) & ~0x03; + + // Allocate the memory + if (!(pd = gfxAlloc((size+sizeof(GDataBuffer)) * num))) + return FALSE; + + // Add each of them to our free list + for(;num--; pd = (GDataBuffer *)((char *)(pd+1)+size)) { + pd->size = size; + gfxBufferRelease(pd); + } + + return TRUE; + } + + void gfxBufferRelease(GDataBuffer *pd) { gfxQueueGSyncPut(&bufferFreeList, (gfxQueueGSyncItem *)pd); } + void gfxBufferReleaseI(GDataBuffer *pd) { gfxQueueGSyncPutI(&bufferFreeList, (gfxQueueGSyncItem *)pd); } + GDataBuffer *gfxBufferGet(delaytime_t ms) { return (GDataBuffer *)gfxQueueGSyncGet(&bufferFreeList, ms); } + GDataBuffer *gfxBufferGetI(void) { return (GDataBuffer *)gfxQueueGSyncGetI(&bufferFreeList); } + bool_t gfxBufferIsAvailable(void) { return bufferFreeList.head != 0; } + +#endif + + #endif /* GFX_USE_GQUEUE */ -- cgit v1.2.3 From c7566aa5531b35a84f06940966f31acadfc85ade Mon Sep 17 00:00:00 2001 From: inmarket Date: Mon, 24 Mar 2014 10:07:02 +1000 Subject: Add some safety parameter checking to queueing --- src/gqueue/gqueue.c | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) (limited to 'src/gqueue/gqueue.c') diff --git a/src/gqueue/gqueue.c b/src/gqueue/gqueue.c index 1b2d4618..8540bcea 100644 --- a/src/gqueue/gqueue.c +++ b/src/gqueue/gqueue.c @@ -64,6 +64,7 @@ void _gqueueDeinit(void) gfxSystemUnlock(); } void gfxQueueASyncPutI(gfxQueueASync *pqueue, gfxQueueASyncItem *pitem) { + if (!pitem) return; // Safety pitem->next = 0; if (!pqueue->head) { pqueue->head = pqueue->tail = pitem; @@ -79,6 +80,7 @@ void _gqueueDeinit(void) gfxSystemUnlock(); } void gfxQueueASyncPushI(gfxQueueASync *pqueue, gfxQueueASyncItem *pitem) { + if (!pitem) return; // Safety pitem->next = pqueue->head; pqueue->head = pitem; if (!pitem->next) @@ -93,8 +95,7 @@ void _gqueueDeinit(void) void gfxQueueASyncRemoveI(gfxQueueASync *pqueue, gfxQueueASyncItem *pitem) { gfxQueueASyncItem *pi; - if (!pitem) - return; + if (!pitem) return; // Safety if (pqueue->head) { if (pqueue->head == pitem) { pqueue->head = pitem->next; @@ -175,6 +176,7 @@ void _gqueueDeinit(void) gfxSystemUnlock(); } void gfxQueueGSyncPutI(gfxQueueGSync *pqueue, gfxQueueGSyncItem *pitem) { + if (!pitem) return; // Safety pitem->next = 0; if (!pqueue->head) { pqueue->head = pqueue->tail = pitem; @@ -191,6 +193,7 @@ void _gqueueDeinit(void) gfxSystemUnlock(); } void gfxQueueGSyncPushI(gfxQueueGSync *pqueue, gfxQueueGSyncItem *pitem) { + if (!pitem) return; // Safety pitem->next = pqueue->head; pqueue->head = pitem; if (!pitem->next) @@ -206,8 +209,7 @@ void _gqueueDeinit(void) void gfxQueueGSyncRemoveI(gfxQueueGSync *pqueue, gfxQueueGSyncItem *pitem) { gfxQueueGSyncItem *pi; - if (!pitem) - return; + if (!pitem) return; // Safety if (pqueue->head) { if (pqueue->head == pitem) { pqueue->head = pitem->next; @@ -276,6 +278,7 @@ void _gqueueDeinit(void) } bool_t gfxQueueFSyncPut(gfxQueueFSync *pqueue, gfxQueueFSyncItem *pitem, delaytime_t ms) { + if (!pitem) return; // Safety gfxSemInit(&pitem->sem, 0, 1); pitem->next = 0; @@ -294,6 +297,7 @@ void _gqueueDeinit(void) } bool_t gfxQueueFSyncPush(gfxQueueFSync *pqueue, gfxQueueFSyncItem *pitem, delaytime_t ms) { + if (!pitem) return; // Safety gfxSemInit(&pitem->sem, 0, 1); gfxSystemLock(); @@ -311,9 +315,7 @@ void _gqueueDeinit(void) void gfxQueueFSyncRemove(gfxQueueFSync *pqueue, gfxQueueFSyncItem *pitem) { gfxQueueFSyncItem *pi; - if (!pitem) - return; - + if (!pitem) return; // Safety gfxSystemLock(); if (pqueue->head) { if (pqueue->head == pitem) { -- cgit v1.2.3