diff options
author | Mike Buland <eichlan@xagasoft.com> | 2012-07-18 07:17:44 +0000 |
---|---|---|
committer | Mike Buland <eichlan@xagasoft.com> | 2012-07-18 07:17:44 +0000 |
commit | a10cdf5cbcfc11e948f2e64e3adb4325f96f6bb4 (patch) | |
tree | a0b44a2aaed09d248be3fc50ff42195b520de83a | |
parent | 364ded646ad4de2065cdf0a2f4282c7eaf7148e6 (diff) | |
download | libbu++-a10cdf5cbcfc11e948f2e64e3adb4325f96f6bb4.tar.gz libbu++-a10cdf5cbcfc11e948f2e64e3adb4325f96f6bb4.tar.bz2 libbu++-a10cdf5cbcfc11e948f2e64e3adb4325f96f6bb4.tar.xz libbu++-a10cdf5cbcfc11e948f2e64e3adb4325f96f6bb4.zip |
Fixed an issue in the seldomly used dequeue( bool ) function in
Bu::SynchroQueue and also added the unblockAll function, which makes the
forever-blocking dequeue function suddenly much more useful.
-rw-r--r-- | src/stable/synchroqueue.h | 29 |
1 files changed, 19 insertions, 10 deletions
diff --git a/src/stable/synchroqueue.h b/src/stable/synchroqueue.h index 7ba299f..1c16e15 100644 --- a/src/stable/synchroqueue.h +++ b/src/stable/synchroqueue.h | |||
@@ -124,23 +124,25 @@ namespace Bu | |||
124 | { | 124 | { |
125 | if( bBlock ) | 125 | if( bBlock ) |
126 | { | 126 | { |
127 | for(;;) | 127 | cBlock.wait(); |
128 | |||
129 | if( pStart == NULL ) | ||
128 | { | 130 | { |
129 | if( pStart != NULL ) | 131 | cBlock.unlock(); |
130 | { | 132 | return NULL; |
131 | cBlock.unlock(); | ||
132 | break; | ||
133 | } | ||
134 | cBlock.wait(); | ||
135 | } | 133 | } |
136 | 134 | T pTmp = pStart->pData; | |
137 | T tmp = dequeue( false ); | 135 | Item *pDel = pStart; |
136 | pStart = pStart->pNext; | ||
137 | delete pDel; | ||
138 | nSize--; | ||
138 | 139 | ||
139 | cBlock.unlock(); | 140 | cBlock.unlock(); |
140 | return tmp; | 141 | return pTmp; |
141 | 142 | ||
142 | } | 143 | } |
143 | 144 | ||
145 | cBlock.unlock(); | ||
144 | return NULL; | 146 | return NULL; |
145 | } | 147 | } |
146 | else | 148 | else |
@@ -226,6 +228,13 @@ namespace Bu | |||
226 | return nRet; | 228 | return nRet; |
227 | } | 229 | } |
228 | 230 | ||
231 | void unblockAll() | ||
232 | { | ||
233 | cBlock.lock(); | ||
234 | cBlock.broadcast(); | ||
235 | cBlock.unlock(); | ||
236 | } | ||
237 | |||
229 | private: | 238 | private: |
230 | Item *pStart; /**< The start of the queue, the next element to dequeue. */ | 239 | Item *pStart; /**< The start of the queue, the next element to dequeue. */ |
231 | Item *pEnd; /**< The end of the queue, the last element to dequeue. */ | 240 | Item *pEnd; /**< The end of the queue, the last element to dequeue. */ |