Mercurial > cgi-bin > hgwebdir.cgi > VMS > C_Libraries > Queue_impl
changeset 2:f4d50d8a1a38
Full VMS test -- works
| author | Me |
|---|---|
| date | Wed, 30 Jun 2010 13:10:42 -0700 |
| parents | 81f6687d52d1 |
| children | 09cfa875abbd |
| files | PrivateQueue.c |
| diffstat | 1 files changed, 44 insertions(+), 15 deletions(-) [+] |
line diff
1.1 --- a/PrivateQueue.c Fri Jun 18 17:49:38 2010 -0700 1.2 +++ b/PrivateQueue.c Wed Jun 30 13:10:42 2010 -0700 1.3 @@ -37,7 +37,9 @@ 1.4 return retQ; 1.5 } 1.6 1.7 -PrivQueueStruc* make_larger_PrivQ( PrivQueueStruc *Q ) 1.8 + 1.9 +void 1.10 +enlargePrivQ( PrivQueueStruc *Q ) 1.11 { int oldSize, newSize; 1.12 void **oldStartOfData; 1.13 1.14 @@ -50,8 +52,6 @@ 1.15 Q->extractPos = &(Q->startOfData[0]); //side by side == empty 1.16 Q->insertPos = &(Q->startOfData[1]); // so start pos's have to be 1.17 Q->endOfData = &(Q->startOfData[newSize - 1]); 1.18 - 1.19 - return Q; 1.20 } 1.21 1.22 1.23 @@ -59,11 +59,11 @@ 1.24 */ 1.25 void* readPrivQ( PrivQueueStruc* Q ) 1.26 { void *out = 0; 1.27 - int startOfData = Q->startOfData; 1.28 - int endOfData = Q->endOfData; 1.29 + void **startOfData = Q->startOfData; 1.30 + void **endOfData = Q->endOfData; 1.31 1.32 - volatile int insertPos = Q->insertPos; 1.33 - volatile int extractPos = Q->extractPos; 1.34 + void **insertPos = Q->insertPos; 1.35 + void **extractPos = Q->extractPos; 1.36 1.37 //if not empty -- extract just below insert when empty 1.38 if( insertPos - extractPos != 1 && 1.39 @@ -82,20 +82,50 @@ 1.40 return NULL; 1.41 } 1.42 1.43 + 1.44 +/*Expands the queue size automatically when it's full 1.45 + */ 1.46 +void 1.47 +writeAndEnlargePrivQ( void * in, PrivQueueStruc* Q ) 1.48 + { 1.49 + void **startOfData = Q->startOfData; 1.50 + void **endOfData = Q->endOfData; 1.51 + 1.52 + void **insertPos = Q->insertPos; 1.53 + void **extractPos = Q->extractPos; 1.54 + 1.55 +tryAgain: 1.56 + if( extractPos - insertPos != 1 && 1.57 + !(insertPos == endOfData && extractPos == startOfData)) 1.58 + { *(Q->insertPos) = in; //insert before move 1.59 + if( insertPos == endOfData ) //write new pos exactly once, correctly 1.60 + { Q->insertPos = startOfData; 1.61 + } 1.62 + else 1.63 + { Q->insertPos++; 1.64 + } 1.65 + return; 1.66 + } 1.67 + //Q is full 1.68 + enlargePrivQ( Q ); 1.69 + goto tryAgain; 1.70 + } 1.71 + 1.72 + 1.73 /*Returns false when the queue was full. 1.74 * have option of calling make_larger_PrivQ to make more room, then try again 1.75 */ 1.76 -bool8 writePrivQ( void * in, PrivQueueStruc* Q ) 1.77 +int writeAndFailPrivQ( void * in, PrivQueueStruc* Q ) 1.78 { 1.79 - int startOfData = Q->startOfData; 1.80 - int endOfData = Q->endOfData; 1.81 - 1.82 - volatile int insertPos = Q->insertPos; 1.83 - volatile int extractPos = Q->extractPos; 1.84 + void **startOfData = Q->startOfData; 1.85 + void **endOfData = Q->endOfData; 1.86 + 1.87 + void **insertPos = Q->insertPos; 1.88 + void **extractPos = Q->extractPos; 1.89 1.90 if( extractPos - insertPos != 1 && 1.91 !(insertPos == endOfData && extractPos == startOfData)) 1.92 - { *(insertPos) = in; //insert before move 1.93 + { *(Q->insertPos) = in; //insert before move 1.94 if( insertPos == endOfData ) //write new pos exactly once, correctly 1.95 { Q->insertPos = startOfData; 1.96 } 1.97 @@ -107,4 +137,3 @@ 1.98 //Q is full 1.99 return FALSE; 1.100 } 1.101 -
