comparison BlockingQueue.c @ 38:b66352de717e

Updated default branch to working versions of all the sub repos
author Sean Halle <seanhalle@yahoo.com>
date Mon, 10 Sep 2012 01:11:54 -0700
parents 7d35d7f42cd5
children a7a6e170708c
comparison
equal deleted inserted replaced
15:69a5b2c0de8f 16:7983830770e8
71 //if not empty -- extract just below insert when empty 71 //if not empty -- extract just below insert when empty
72 if( insertPos - extractPos != 1 && 72 if( insertPos - extractPos != 1 &&
73 !(extractPos == endOfData && insertPos == startOfData)) 73 !(extractPos == endOfData && insertPos == startOfData))
74 { //move before read 74 { //move before read
75 if( extractPos == endOfData ) //write new pos exactly once, correctly 75 if( extractPos == endOfData ) //write new pos exactly once, correctly
76 { Q->extractPos = startOfData; //can't overrun then fix it 'cause 76 { Q->extractPos = (volatile void **)startOfData;
77 } // other thread might read bad pos 77 }
78 else 78 else
79 { Q->extractPos++; 79 { Q->extractPos++;
80 } 80 }
81 out = (void *) *(Q->extractPos); 81 out = (void *) *(Q->extractPos);
82 Q->extractLock = UNLOCKED; 82 Q->extractLock = UNLOCKED;
117 // 'cause both insertor Thd and extractor Thd would write it 117 // 'cause both insertor Thd and extractor Thd would write it
118 if( extractPos - insertPos != 1 && 118 if( extractPos - insertPos != 1 &&
119 !(insertPos == endOfData && extractPos == startOfData)) 119 !(insertPos == endOfData && extractPos == startOfData))
120 { *(Q->insertPos) = in; //insert before move 120 { *(Q->insertPos) = in; //insert before move
121 if( insertPos == endOfData ) 121 if( insertPos == endOfData )
122 { Q->insertPos = startOfData; 122 { Q->insertPos = (volatile void **)startOfData;
123 } 123 }
124 else 124 else
125 { Q->insertPos++; 125 { Q->insertPos++;
126 } 126 }
127 Q->insertLock = UNLOCKED; 127 Q->insertLock = UNLOCKED;