diff --git a/libwvdrmengine/cdm/core/src/cdm_engine.cpp b/libwvdrmengine/cdm/core/src/cdm_engine.cpp index c7bc47d4..da3a1b71 100644 --- a/libwvdrmengine/cdm/core/src/cdm_engine.cpp +++ b/libwvdrmengine/cdm/core/src/cdm_engine.cpp @@ -1655,51 +1655,54 @@ void CdmEngine::OnTimerEvent() { bool is_initial_usage_update = false; bool is_usage_update_needed = false; - AutoLock lock(session_map_lock_); - CdmSessionList sessions; - session_map_.GetSessionList(sessions); - - while (!sessions.empty()) { - is_initial_usage_update = - is_initial_usage_update || sessions.front()->is_initial_usage_update(); - is_usage_update_needed = - is_usage_update_needed || sessions.front()->is_usage_update_needed(); - - sessions.front()->OnTimerEvent(usage_update_period_expired); - sessions.pop_front(); - } - - if (is_usage_update_needed && - (usage_update_period_expired || is_initial_usage_update)) { - bool has_usage_been_updated = false; - - // Session list may have changed. Rebuild. + { + AutoLock lock(session_map_lock_); + CdmSessionList sessions; session_map_.GetSessionList(sessions); - for (CdmSessionList::iterator iter = sessions.begin(); - iter != sessions.end(); ++iter) { - (*iter)->reset_usage_flags(); - switch ((*iter)->get_usage_support_type()) { - case kUsageEntrySupport: - if ((*iter)->has_provider_session_token()) { - (*iter)->UpdateUsageEntryInformation(); - } - break; - case kUsageTableSupport: - if (!has_usage_been_updated) { - // usage is updated for all sessions so this needs to be - // called only once per update usage information period - CdmResponseType status = (*iter)->UpdateUsageTableInformation(); - if (NO_ERROR != status) { - LOGW("Update usage information failed: %d", status); - } else { - has_usage_been_updated = true; + while (!sessions.empty()) { + is_initial_usage_update = + is_initial_usage_update || + sessions.front()->is_initial_usage_update(); + is_usage_update_needed = + is_usage_update_needed || sessions.front()->is_usage_update_needed(); + + sessions.front()->OnTimerEvent(usage_update_period_expired); + sessions.pop_front(); + } + + if (is_usage_update_needed && + (usage_update_period_expired || is_initial_usage_update)) { + bool has_usage_been_updated = false; + + // Session list may have changed. Rebuild. + session_map_.GetSessionList(sessions); + + for (CdmSessionList::iterator iter = sessions.begin(); + iter != sessions.end(); ++iter) { + (*iter)->reset_usage_flags(); + switch ((*iter)->get_usage_support_type()) { + case kUsageEntrySupport: + if ((*iter)->has_provider_session_token()) { + (*iter)->UpdateUsageEntryInformation(); } - } - break; - default: - // Ignore - break; + break; + case kUsageTableSupport: + if (!has_usage_been_updated) { + // usage is updated for all sessions so this needs to be + // called only once per update usage information period + CdmResponseType status = (*iter)->UpdateUsageTableInformation(); + if (NO_ERROR != status) { + LOGW("Update usage information failed: %d", status); + } else { + has_usage_been_updated = true; + } + } + break; + default: + // Ignore + break; + } } } }