Mercurial > cgi-bin > hgwebdir.cgi > VMS > C_Libraries > Queue_impl
comparison PrivateQueue.c @ 12:3134d8a1e8e3
added pushPrivQ -- treats Q as stack, pushed elem is first out
| author | SeanHalle |
|---|---|
| date | Thu, 11 Nov 2010 04:19:01 -0800 |
| parents | 3562716ebdbd |
| children | 1ab93714b9c1 |
comparison
equal
deleted
inserted
replaced
| 5:ae4ea439d8dd | 6:9a6475f2cbc9 |
|---|---|
| 154 } | 154 } |
| 155 //Q is full | 155 //Q is full |
| 156 return FALSE; | 156 return FALSE; |
| 157 } | 157 } |
| 158 | 158 |
| 159 /*Treats queue as a stack -- no matter contents, if read done right after | |
| 160 * a push, then the pushed item is what comes out. | |
| 161 * Expands the queue size automatically when it's full. | |
| 162 */ | |
| 163 void | |
| 164 pushPrivQ( void * in, PrivQueueStruc* Q ) | |
| 165 { | |
| 166 void **startOfData = Q->startOfData; | |
| 167 void **endOfData = Q->endOfData; | |
| 168 | |
| 169 void **insertPos = Q->insertPos; | |
| 170 void **extractPos = Q->extractPos; | |
| 171 | |
| 172 tryAgain: | |
| 173 //Full? (insert is just below extract when full) | |
| 174 if( extractPos - insertPos != 1 && | |
| 175 !(insertPos == endOfData && extractPos == startOfData)) | |
| 176 { //insert -- but go backwards, inserting at read position then | |
| 177 // move read pos backwards | |
| 178 *(Q->extractPos) = in; | |
| 179 if( extractPos == startOfData ) //write new pos exactly once, correctly | |
| 180 { Q->extractPos = endOfData; //can't overrun then fix it 'cause | |
| 181 } // other thread might read bad pos | |
| 182 else | |
| 183 { Q->extractPos--; | |
| 184 } | |
| 185 return; | |
| 186 } | |
| 187 //Q is full | |
| 188 enlargePrivQ( Q ); | |
| 189 goto tryAgain; | |
| 190 } | |
| 191 | |
| 159 void | 192 void |
| 160 freePrivQ( PrivQueueStruc *Q ) | 193 freePrivQ( PrivQueueStruc *Q ) |
| 161 { | 194 { |
| 162 VMS__free( Q->startOfData ); | 195 VMS__free( Q->startOfData ); |
| 163 VMS__free( Q ); | 196 VMS__free( Q ); |
