# HG changeset patch # User Me # Date 1277928642 25200 # Node ID f4d50d8a1a38390ce48af2ab71503541b8d80a7e # Parent 81f6687d52d15c48f791418b5d937f251281fd96 Full VMS test -- works diff -r 81f6687d52d1 -r f4d50d8a1a38 PrivateQueue.c --- a/PrivateQueue.c Fri Jun 18 17:49:38 2010 -0700 +++ b/PrivateQueue.c Wed Jun 30 13:10:42 2010 -0700 @@ -37,7 +37,9 @@ return retQ; } -PrivQueueStruc* make_larger_PrivQ( PrivQueueStruc *Q ) + +void +enlargePrivQ( PrivQueueStruc *Q ) { int oldSize, newSize; void **oldStartOfData; @@ -50,8 +52,6 @@ Q->extractPos = &(Q->startOfData[0]); //side by side == empty Q->insertPos = &(Q->startOfData[1]); // so start pos's have to be Q->endOfData = &(Q->startOfData[newSize - 1]); - - return Q; } @@ -59,11 +59,11 @@ */ void* readPrivQ( PrivQueueStruc* Q ) { void *out = 0; - int startOfData = Q->startOfData; - int endOfData = Q->endOfData; + void **startOfData = Q->startOfData; + void **endOfData = Q->endOfData; - volatile int insertPos = Q->insertPos; - volatile int extractPos = Q->extractPos; + void **insertPos = Q->insertPos; + void **extractPos = Q->extractPos; //if not empty -- extract just below insert when empty if( insertPos - extractPos != 1 && @@ -82,20 +82,50 @@ return NULL; } + +/*Expands the queue size automatically when it's full + */ +void +writeAndEnlargePrivQ( void * in, PrivQueueStruc* Q ) + { + void **startOfData = Q->startOfData; + void **endOfData = Q->endOfData; + + void **insertPos = Q->insertPos; + void **extractPos = Q->extractPos; + +tryAgain: + if( extractPos - insertPos != 1 && + !(insertPos == endOfData && extractPos == startOfData)) + { *(Q->insertPos) = in; //insert before move + if( insertPos == endOfData ) //write new pos exactly once, correctly + { Q->insertPos = startOfData; + } + else + { Q->insertPos++; + } + return; + } + //Q is full + enlargePrivQ( Q ); + goto tryAgain; + } + + /*Returns false when the queue was full. * have option of calling make_larger_PrivQ to make more room, then try again */ -bool8 writePrivQ( void * in, PrivQueueStruc* Q ) +int writeAndFailPrivQ( void * in, PrivQueueStruc* Q ) { - int startOfData = Q->startOfData; - int endOfData = Q->endOfData; - - volatile int insertPos = Q->insertPos; - volatile int extractPos = Q->extractPos; + void **startOfData = Q->startOfData; + void **endOfData = Q->endOfData; + + void **insertPos = Q->insertPos; + void **extractPos = Q->extractPos; if( extractPos - insertPos != 1 && !(insertPos == endOfData && extractPos == startOfData)) - { *(insertPos) = in; //insert before move + { *(Q->insertPos) = in; //insert before move if( insertPos == endOfData ) //write new pos exactly once, correctly { Q->insertPos = startOfData; } @@ -107,4 +137,3 @@ //Q is full return FALSE; } -