# HG changeset patch # User Nina Engelhardt # Date 1362576835 -3600 # Node ID c54f7e0a9d112f31a4417efb2c6dabc5998b3150 # Parent 8fcbe46de60a68d2c0a8bef5e7f8ef20a584d246 fix peek + debug code diff -r 8fcbe46de60a -r c54f7e0a9d11 PrivateQueue.c --- a/PrivateQueue.c Wed Dec 19 15:38:08 2012 +0100 +++ b/PrivateQueue.c Wed Mar 06 14:33:55 2013 +0100 @@ -149,11 +149,17 @@ void **extractPos = Q->extractPos; //if not empty -- (extract is just below insert when empty) - if( insertPos - extractPos != 1 && - !(extractPos == endOfData && insertPos == startOfData)) - { - out = *(Q->extractPos + 1); - return out; + if (insertPos - extractPos != 1 && + !(extractPos == endOfData && insertPos == startOfData)) { //move before read + if (extractPos == endOfData) //write new pos exactly once, correctly + { + out = *(startOfData); //can't overrun then fix it 'cause + }// other thread might read bad pos + else { + out = *(Q->extractPos + 1); + } + + return out; } //Q is empty return NULL; @@ -162,9 +168,6 @@ /*Returns NULL when queue is empty */ void* readPrivQ(PrivQueueStruc* Q) { -#ifdef DEBUG_PRIVATE_Q - Q->numReads++; -#endif void *out = 0; void **startOfData = Q->startOfData; @@ -184,6 +187,10 @@ Q->extractPos++; } out = *(Q->extractPos); + //*(Q->extractPos) = NULL; +#ifdef DEBUG_PRIVATE_Q + Q->numReads++; +#endif return out; } //Q is empty