5#ifndef BITCOIN_CHECKQUEUE_H
6#define BITCOIN_CHECKQUEUE_H
72 std::vector<T> vChecks;
74 unsigned int nNow = 0;
83 if (nTodo == 0 && !fMaster)
91 while (queue.empty() && !m_request_stop) {
92 if (fMaster && nTodo == 0) {
104 if (m_request_stop) {
113 nNow = std::max(1U, std::min(
nBatchSize, (
unsigned int)queue.size() / (nTotal + nIdle + 1)));
114 vChecks.resize(nNow);
115 for (
unsigned int i = 0; i < nNow; i++) {
118 vChecks[i].swap(queue.back());
125 for (
T& check : vChecks)
152 for (
int n = 0; n < threads_num; ++n) {
168 void Add(std::vector<T>& vChecks)
171 for (
T& check : vChecks) {
172 queue.push_back(
T());
173 check.swap(queue.back());
175 nTodo += vChecks.size();
176 if (vChecks.size() == 1)
178 else if (vChecks.size() > 1)
228 bool fRet =
pqueue->Wait();
233 void Add(std::vector<T>& vChecks)
RAII-style controller object for a CCheckQueue that guarantees the passed queue is finished before co...
CCheckQueueControl & operator=(const CCheckQueueControl &)=delete
CCheckQueue< T > *const pqueue
CCheckQueueControl(CCheckQueue< T > *const pqueueIn)
CCheckQueueControl()=delete
void Add(std::vector< T > &vChecks)
CCheckQueueControl(const CCheckQueueControl &)=delete
Queue for verifications that have to be performed.
const unsigned int nBatchSize
The maximum number of elements to be processed in one batch.
void StopWorkerThreads()
Stop all of the worker threads.
std::condition_variable m_master_cv
Master thread blocks on this when out of work.
bool fAllOk GUARDED_BY(m_mutex)
The temporary evaluation result.
bool m_request_stop GUARDED_BY(m_mutex)
bool Wait()
Wait until execution finishes, and return whether all evaluations were successful.
int nTotal GUARDED_BY(m_mutex)
The total number of workers (including the master).
std::vector< std::thread > m_worker_threads
Mutex m_control_mutex
Mutex to ensure only one concurrent CCheckQueueControl.
bool Loop(bool fMaster)
Internal function that does bulk of the verification work.
std::condition_variable m_worker_cv
Worker threads block on this when out of work.
Mutex m_mutex
Mutex to protect the inner state.
void StartWorkerThreads(const int threads_num)
Create a pool of new worker threads.
CCheckQueue(unsigned int nBatchSizeIn)
Create a new check queue.
int nIdle GUARDED_BY(m_mutex)
The number of workers (including the master) that are idle.
void Add(std::vector< T > &vChecks)
Add a batch of checks to the queue.
unsigned int nTodo GUARDED_BY(m_mutex)
Number of verifications that haven't completed yet.
std::vector< T > queue GUARDED_BY(m_mutex)
The queue of elements to be processed.
#define T(expected, seed, data)
void ThreadRename(std::string &&)
Rename a thread both in terms of an internal (in-memory) name as well as its system thread name.
#define WAIT_LOCK(cs, name)
#define ENTER_CRITICAL_SECTION(cs)
#define LEAVE_CRITICAL_SECTION(cs)
#define WITH_LOCK(cs, code)
Run code while locking a mutex.
void SetSyscallSandboxPolicy(SyscallSandboxPolicy syscall_policy)
Force the current thread (and threads created from the current thread) into a restricted-service oper...
@ VALIDATION_SCRIPT_CHECK