Mercurial > cgi-bin > hgwebdir.cgi > VMS > C_Libraries > Queue_impl
diff PrivateQueue.c @ 42:c54f7e0a9d11
fix peek + debug code
| author | Nina Engelhardt <nengel@mailbox.tu-berlin.de> |
|---|---|
| date | Wed, 06 Mar 2013 14:33:55 +0100 |
| parents | 8fcbe46de60a |
| children | 0b3e087a6d37 |
line diff
1.1 --- a/PrivateQueue.c Wed Dec 19 15:38:08 2012 +0100 1.2 +++ b/PrivateQueue.c Wed Mar 06 14:33:55 2013 +0100 1.3 @@ -149,11 +149,17 @@ 1.4 void **extractPos = Q->extractPos; 1.5 1.6 //if not empty -- (extract is just below insert when empty) 1.7 - if( insertPos - extractPos != 1 && 1.8 - !(extractPos == endOfData && insertPos == startOfData)) 1.9 - { 1.10 - out = *(Q->extractPos + 1); 1.11 - return out; 1.12 + if (insertPos - extractPos != 1 && 1.13 + !(extractPos == endOfData && insertPos == startOfData)) { //move before read 1.14 + if (extractPos == endOfData) //write new pos exactly once, correctly 1.15 + { 1.16 + out = *(startOfData); //can't overrun then fix it 'cause 1.17 + }// other thread might read bad pos 1.18 + else { 1.19 + out = *(Q->extractPos + 1); 1.20 + } 1.21 + 1.22 + return out; 1.23 } 1.24 //Q is empty 1.25 return NULL; 1.26 @@ -162,9 +168,6 @@ 1.27 /*Returns NULL when queue is empty 1.28 */ 1.29 void* readPrivQ(PrivQueueStruc* Q) { 1.30 -#ifdef DEBUG_PRIVATE_Q 1.31 - Q->numReads++; 1.32 -#endif 1.33 1.34 void *out = 0; 1.35 void **startOfData = Q->startOfData; 1.36 @@ -184,6 +187,10 @@ 1.37 Q->extractPos++; 1.38 } 1.39 out = *(Q->extractPos); 1.40 + //*(Q->extractPos) = NULL; 1.41 +#ifdef DEBUG_PRIVATE_Q 1.42 + Q->numReads++; 1.43 +#endif 1.44 return out; 1.45 } 1.46 //Q is empty
