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;