# HG changeset patch # User nkeynes # Date 1332044298 -36000 # Node ID 32b2a340f8b3747aab12a50bd3cf7b14fb13c1c1 # Parent 0b947d9240298ae06bd82531cf892087871c3af2 Fix silly errors in tqueue implementation --- a/src/tqueue.c Sat Mar 17 08:36:17 2012 +1000 +++ b/src/tqueue.c Sun Mar 18 14:18:18 2012 +1000 @@ -41,7 +41,7 @@ /************** Producer thread **************/ #define TQUEUE_EMPTY() (tqueue.head == tqueue.tail) -#define TQUEUE_FULL() ((tqueue.head == tqueue.tail+1) || (tqueue.head == 0 && tqueue.tail == TQUEUE_LENGTH)) +#define TQUEUE_FULL() ((tqueue.head == tqueue.tail+1) || (tqueue.head == 0 && tqueue.tail == (TQUEUE_LENGTH-1))) static void tqueue_enqueue( tqueue_callback callback, void *data, gboolean sync ) { @@ -50,6 +50,8 @@ tqueue.tqueue[tqueue.tail].data = data; tqueue.tqueue[tqueue.tail].synchronous = sync; tqueue.tail++; + if( tqueue.tail == TQUEUE_LENGTH ) + tqueue.tail = 0; } /** @@ -73,6 +75,7 @@ */ int tqueue_send_message( tqueue_callback callback, void *data ) { + int result; pthread_mutex_lock(&tqueue.mutex); if( TQUEUE_FULL() ) { /* Wait for the queue to clear */ @@ -81,8 +84,9 @@ tqueue_enqueue( callback, data, TRUE ); pthread_cond_signal(&tqueue.consumer_wait); pthread_cond_wait(&tqueue.producer_sync_wait, &tqueue.mutex); - return tqueue.last_result; + result = tqueue.last_result; pthread_mutex_unlock(&tqueue.mutex); + return result; } /************** Consumer thread **************/ @@ -95,6 +99,8 @@ void *data = tqueue.tqueue[tqueue.head].data; gboolean sync = tqueue.tqueue[tqueue.head].synchronous; tqueue.head++; + if( tqueue.head == TQUEUE_LENGTH ) + tqueue.head = 0; if( wasFull ) { pthread_cond_signal( &tqueue.producer_full_wait );