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 -