/** * Leave a level of model loads in the current thread. * If it was the last level, call the global callbacks. */ void PostLoadCallBack::leave() { threadsLock_.grab(); bool wasLastLevel = (--threads_[OurThreadID()].enterCount == 0); threadsLock_.give(); if (wasLastLevel) run( true ); }
/** * This method runs all callbacks from one of the lists */ void PostLoadCallBack::run( bool global ) { SimpleMutexHolder smh( threadsLock_ ); std::vector< PostLoadCallBack * > * cbs; PLCBs & plcbs = threads_[OurThreadID()]; cbs = global ? &plcbs.globals : &plcbs.locals; while (!cbs->empty()) { PostLoadCallBack * lf = cbs->front(); cbs->erase( cbs->begin() ); threadsLock_.give(); (*lf)(); delete lf; threadsLock_.grab(); PLCBs & plcbs = threads_[OurThreadID()]; cbs = global ? &plcbs.globals : &plcbs.locals; } }