void CRateLimiter::WakeupWaitingObjects(fz::scoped_lock & l) { for (int i = 0; i < 2; ++i) { while (!m_wakeupList[i].empty()) { CRateLimiterObject* pObject = m_wakeupList[i].front(); m_wakeupList[i].pop_front(); if (!pObject->m_waiting[i]) continue; assert(pObject->m_bytesAvailable[i] != 0); pObject->m_waiting[i] = false; l.unlock(); // Do not hold while executing callback pObject->OnRateAvailable((rate_direction)i); l.lock(); } } }
void CRateLimiter::WakeupWaitingObjects() { for (int i = 0; i < 2; i++) { while (!m_wakeupList[i].empty()) { CRateLimiterObject* pObject = m_wakeupList[i].front(); m_wakeupList[i].pop_front(); if (!pObject->m_waiting[i]) continue; wxASSERT(pObject->m_bytesAvailable != 0); pObject->m_waiting[i] = false; pObject->OnRateAvailable((rate_direction)i); } } }