void OverlayImpl::remove (Child& child) { std::lock_guard<decltype(mutex_)> lock(mutex_); list_.erase(&child); if (list_.empty()) checkStopped(); }
//-------------------------------------------------------------------------- // // Runs the next appropriate waiting Job. // // Pre-conditions: // A RunnableJob must exist in the JobSet // // Post-conditions: // The chosen RunnableJob will have Job::doJob() called. // // Invariants: // <none> // void processTask () { Job job; { ScopedLock lock (m_mutex); getNextJob (job, lock); ++m_processCount; } JobTypeData& data (getJobTypeData (job.getType ())); // Skip the job if we are stopping and the // skipOnStop flag is set for the job type // if (!isStopping() || !data.info.skip ()) { beast::Thread::setCurrentThreadName (data.name ()); m_journal.trace << "Doing " << data.name () << " job"; Job::clock_type::time_point const start_time ( Job::clock_type::now()); on_dequeue (job.getType (), start_time - job.queue_time ()); job.doJob (); on_execute (job.getType (), Job::clock_type::now() - start_time); } else { m_journal.trace << "Skipping processTask ('" << data.name () << "')"; } { ScopedLock lock (m_mutex); finishJob (job, lock); --m_processCount; checkStopped (lock); } // Note that when Job::~Job is called, the last reference // to the associated LoadEvent object (in the Job) may be destroyed. }
void onChildrenStopped () { ScopedLock lock (m_mutex); checkStopped (lock); }
void OverlayImpl::onChildrenStopped () { std::lock_guard <decltype(mutex_)> lock (mutex_); checkStopped (); }