Skip to content

Commit 1b864c9

Browse files
committed
Merge bitcoin#9497 via remote-tracking branch 'origin-pull/9497/head' into 0.14.2_fixes
2 parents 77de9bb + 96c7f2c commit 1b864c9

File tree

3 files changed

+455
-10
lines changed

3 files changed

+455
-10
lines changed

src/Makefile.test.include

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -89,6 +89,7 @@ BITCOIN_TESTS =\
8989
test/blockencodings_tests.cpp \
9090
test/bloom_tests.cpp \
9191
test/bswap_tests.cpp \
92+
test/checkqueue_tests.cpp \
9293
test/coins_tests.cpp \
9394
test/compress_tests.cpp \
9495
test/crypto_tests.cpp \

src/checkqueue.h

Lines changed: 12 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -127,6 +127,9 @@ class CCheckQueue
127127
}
128128

129129
public:
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>
177174
class CCheckQueueControl
178175
{
179176
private:
180-
CCheckQueue<T>* pqueue;
177+
CCheckQueue<T> * const pqueue;
181178
bool fDone;
182179

183180
public:
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

Comments
 (0)