Mercurial > cgi-bin > hgwebdir.cgi > VMS > C_Libraries > Queue_impl
comparison PrivateQueue.c @ 6:174a7c2ca340
Works with sequential version -- not sure changes, but works
| author | Me |
|---|---|
| date | Wed, 28 Jul 2010 13:13:01 -0700 |
| parents | f4d50d8a1a38 |
| children | 93bf3ffcc1fb |
comparison
equal
deleted
inserted
replaced
| 1:d17692922bff | 2:4d933db7f6d8 |
|---|---|
| 43 { int oldSize, newSize; | 43 { int oldSize, newSize; |
| 44 void **oldStartOfData; | 44 void **oldStartOfData; |
| 45 | 45 |
| 46 oldSize = Q->endOfData - Q->startOfData; | 46 oldSize = Q->endOfData - Q->startOfData; |
| 47 newSize = 2 * oldSize; | 47 newSize = 2 * oldSize; |
| 48 oldStartOfData = Q->startOfData; | |
| 48 Q->startOfData = malloc( newSize * sizeof(void *) ); | 49 Q->startOfData = malloc( newSize * sizeof(void *) ); |
| 49 memcpy(Q->startOfData, oldStartOfData, oldSize * sizeof(void *)); | 50 memcpy(Q->startOfData, oldStartOfData, oldSize * sizeof(void *)); |
| 50 free(oldStartOfData); | 51 free(oldStartOfData); |
| 51 | 52 |
| 52 Q->extractPos = &(Q->startOfData[0]); //side by side == empty | 53 Q->extractPos = &(Q->startOfData[0]); //side by side == empty |
| 63 void **endOfData = Q->endOfData; | 64 void **endOfData = Q->endOfData; |
| 64 | 65 |
| 65 void **insertPos = Q->insertPos; | 66 void **insertPos = Q->insertPos; |
| 66 void **extractPos = Q->extractPos; | 67 void **extractPos = Q->extractPos; |
| 67 | 68 |
| 68 //if not empty -- extract just below insert when empty | 69 //if not empty -- (extract is just below insert when empty) |
| 69 if( insertPos - extractPos != 1 && | 70 if( insertPos - extractPos != 1 && |
| 70 !(extractPos == endOfData && insertPos == startOfData)) | 71 !(extractPos == endOfData && insertPos == startOfData)) |
| 71 { //move before read | 72 { //move before read |
| 72 if( extractPos == endOfData ) //write new pos exactly once, correctly | 73 if( extractPos == endOfData ) //write new pos exactly once, correctly |
| 73 { Q->extractPos = startOfData; //can't overrun then fix it 'cause | 74 { Q->extractPos = startOfData; //can't overrun then fix it 'cause |
| 84 | 85 |
| 85 | 86 |
| 86 /*Expands the queue size automatically when it's full | 87 /*Expands the queue size automatically when it's full |
| 87 */ | 88 */ |
| 88 void | 89 void |
| 89 writeAndEnlargePrivQ( void * in, PrivQueueStruc* Q ) | 90 writePrivQ( void * in, PrivQueueStruc* Q ) |
| 90 { | 91 { |
| 91 void **startOfData = Q->startOfData; | 92 void **startOfData = Q->startOfData; |
| 92 void **endOfData = Q->endOfData; | 93 void **endOfData = Q->endOfData; |
| 93 | 94 |
| 94 void **insertPos = Q->insertPos; | 95 void **insertPos = Q->insertPos; |
| 95 void **extractPos = Q->extractPos; | 96 void **extractPos = Q->extractPos; |
| 96 | 97 |
| 97 tryAgain: | 98 tryAgain: |
| 99 //Full? (insert is just below extract when full) | |
| 98 if( extractPos - insertPos != 1 && | 100 if( extractPos - insertPos != 1 && |
| 99 !(insertPos == endOfData && extractPos == startOfData)) | 101 !(insertPos == endOfData && extractPos == startOfData)) |
| 100 { *(Q->insertPos) = in; //insert before move | 102 { *(Q->insertPos) = in; //insert before move |
| 101 if( insertPos == endOfData ) //write new pos exactly once, correctly | 103 if( insertPos == endOfData ) //write new pos exactly once, correctly |
| 102 { Q->insertPos = startOfData; | 104 { Q->insertPos = startOfData; |
| 113 | 115 |
| 114 | 116 |
| 115 /*Returns false when the queue was full. | 117 /*Returns false when the queue was full. |
| 116 * have option of calling make_larger_PrivQ to make more room, then try again | 118 * have option of calling make_larger_PrivQ to make more room, then try again |
| 117 */ | 119 */ |
| 118 int writeAndFailPrivQ( void * in, PrivQueueStruc* Q ) | 120 int writeIfSpacePrivQ( void * in, PrivQueueStruc* Q ) |
| 119 { | 121 { |
| 120 void **startOfData = Q->startOfData; | 122 void **startOfData = Q->startOfData; |
| 121 void **endOfData = Q->endOfData; | 123 void **endOfData = Q->endOfData; |
| 122 | 124 |
| 123 void **insertPos = Q->insertPos; | 125 void **insertPos = Q->insertPos; |
