Mercurial > cgi-bin > hgwebdir.cgi > VMS > C_Libraries > Queue_impl
comparison 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 |
comparison
equal
deleted
inserted
replaced
| 24:8b6ec6c1dea5 | 25:2cdbe37cec11 |
|---|---|
| 147 | 147 |
| 148 void **insertPos = Q->insertPos; | 148 void **insertPos = Q->insertPos; |
| 149 void **extractPos = Q->extractPos; | 149 void **extractPos = Q->extractPos; |
| 150 | 150 |
| 151 //if not empty -- (extract is just below insert when empty) | 151 //if not empty -- (extract is just below insert when empty) |
| 152 if( insertPos - extractPos != 1 && | 152 if (insertPos - extractPos != 1 && |
| 153 !(extractPos == endOfData && insertPos == startOfData)) | 153 !(extractPos == endOfData && insertPos == startOfData)) { //move before read |
| 154 { | 154 if (extractPos == endOfData) //write new pos exactly once, correctly |
| 155 out = *(Q->extractPos + 1); | 155 { |
| 156 return out; | 156 out = *(startOfData); //can't overrun then fix it 'cause |
| 157 }// other thread might read bad pos | |
| 158 else { | |
| 159 out = *(Q->extractPos + 1); | |
| 160 } | |
| 161 | |
| 162 return out; | |
| 157 } | 163 } |
| 158 //Q is empty | 164 //Q is empty |
| 159 return NULL; | 165 return NULL; |
| 160 } | 166 } |
| 161 | 167 |
| 162 /*Returns NULL when queue is empty | 168 /*Returns NULL when queue is empty |
| 163 */ | 169 */ |
| 164 void* readPrivQ(PrivQueueStruc* Q) { | 170 void* readPrivQ(PrivQueueStruc* Q) { |
| 165 #ifdef DEBUG_PRIVATE_Q | |
| 166 Q->numReads++; | |
| 167 #endif | |
| 168 | 171 |
| 169 void *out = 0; | 172 void *out = 0; |
| 170 void **startOfData = Q->startOfData; | 173 void **startOfData = Q->startOfData; |
| 171 void **endOfData = Q->endOfData; | 174 void **endOfData = Q->endOfData; |
| 172 | 175 |
| 182 }// other thread might read bad pos | 185 }// other thread might read bad pos |
| 183 else { | 186 else { |
| 184 Q->extractPos++; | 187 Q->extractPos++; |
| 185 } | 188 } |
| 186 out = *(Q->extractPos); | 189 out = *(Q->extractPos); |
| 190 //*(Q->extractPos) = NULL; | |
| 191 #ifdef DEBUG_PRIVATE_Q | |
| 192 Q->numReads++; | |
| 193 #endif | |
| 187 return out; | 194 return out; |
| 188 } | 195 } |
| 189 //Q is empty | 196 //Q is empty |
| 190 return NULL; | 197 return NULL; |
| 191 } | 198 } |
