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 );