void CacheIOThread::LoopOneLevel(uint32_t aLevel) { EventQueue events; events.SwapElements(mEventQueue[aLevel]); EventQueue::size_type length = events.Length(); mCurrentlyExecutingLevel = aLevel; bool returnEvents = false; bool reportTelementry = true; EventQueue::size_type index; { MonitorAutoUnlock unlock(mMonitor); for (index = 0; index < length; ++index) { if (EventsPending(aLevel)) { // Somebody scheduled a new event on a lower level, break and harry // to execute it! Don't forget to return what we haven't exec. returnEvents = true; break; } if (reportTelementry) { reportTelementry = false; CacheIOTelemetry::Report(aLevel, length); } // Drop any previous flagging, only an event on the current level may set // this flag. mRerunCurrentEvent = false; events[index]->Run(); if (mRerunCurrentEvent) { // The event handler yields to higher priority events and wants to rerun. returnEvents = true; break; } // Release outside the lock. events[index] = nullptr; } } if (returnEvents) mEventQueue[aLevel].InsertElementsAt(0, events.Elements() + index, length - index); }