@@ -127,6 +127,9 @@ class CCheckQueue
127127 }
128128
129129public:
130+ // ! Mutex to ensure only one concurrent CCheckQueueControl
131+ boost::mutex ControlMutex;
132+
130133 // ! Create a new check queue
131134 CCheckQueue (unsigned int nBatchSizeIn) : nIdle(0 ), nTotal(0 ), fAllOk (true ), nTodo(0 ), fQuit (false ), nBatchSize(nBatchSizeIn) {}
132135
@@ -161,12 +164,6 @@ class CCheckQueue
161164 {
162165 }
163166
164- bool IsIdle ()
165- {
166- boost::unique_lock<boost::mutex> lock (mutex);
167- return (nTotal == nIdle && nTodo == 0 && fAllOk == true );
168- }
169-
170167};
171168
172169/* *
@@ -177,16 +174,18 @@ template <typename T>
177174class CCheckQueueControl
178175{
179176private:
180- CCheckQueue<T>* pqueue;
177+ CCheckQueue<T> * const pqueue;
181178 bool fDone ;
182179
183180public:
184- CCheckQueueControl (CCheckQueue<T>* pqueueIn) : pqueue(pqueueIn), fDone (false )
181+ CCheckQueueControl () = delete ;
182+ CCheckQueueControl (const CCheckQueueControl&) = delete ;
183+ CCheckQueueControl& operator =(const CCheckQueueControl&) = delete ;
184+ explicit CCheckQueueControl (CCheckQueue<T> * const pqueueIn) : pqueue(pqueueIn), fDone(false )
185185 {
186186 // passed queue is supposed to be unused, or NULL
187187 if (pqueue != NULL ) {
188- bool isIdle = pqueue->IsIdle ();
189- assert (isIdle);
188+ ENTER_CRITICAL_SECTION (pqueue->ControlMutex );
190189 }
191190 }
192191
@@ -209,6 +208,9 @@ class CCheckQueueControl
209208 {
210209 if (!fDone )
211210 Wait ();
211+ if (pqueue != NULL ) {
212+ LEAVE_CRITICAL_SECTION (pqueue->ControlMutex );
213+ }
212214 }
213215};
214216
0 commit comments