From 75eef5c3a3e2bcbc003b697fc2b6c1de0f842005 Mon Sep 17 00:00:00 2001 From: Nisha CT Date: Wed, 15 Feb 2023 10:03:58 +0000 Subject: [PATCH] Update to handle spurious wake up in conditional variable Bug: 265234582 Bug: 217181322 Test: make libwvdrmengine Change-Id: I6256f60ab871184298c1bfc44632c501a2db018c --- .../cdm/core/src/oemcrypto_adapter_dynamic.cpp | 17 ++++++++++++++++- 1 file changed, 16 insertions(+), 1 deletion(-) diff --git a/libwvdrmengine/cdm/core/src/oemcrypto_adapter_dynamic.cpp b/libwvdrmengine/cdm/core/src/oemcrypto_adapter_dynamic.cpp index d674fc61..f37d8579 100644 --- a/libwvdrmengine/cdm/core/src/oemcrypto_adapter_dynamic.cpp +++ b/libwvdrmengine/cdm/core/src/oemcrypto_adapter_dynamic.cpp @@ -44,6 +44,12 @@ using video_widevine::ProvisioningResponse; using wvcdm::kLevel3; using wvcdm::kLevelDefault; using namespace std; +using namespace std::chrono; + +#define GET_TIME() \ + ((duration_cast(system_clock::now().time_since_epoch())) \ + .count()) +#define TIMEOUT_IN_MILLISECONDS 2 * 60 * 1000 // 2 minutes namespace { @@ -528,7 +534,16 @@ class WatchDog { { std::unique_lock lock(mutex_); if (running_) { - condition_.wait_for(lock, std::chrono::minutes(2)); + bool waitStatus = false; + time_t time = GET_TIME(); + do { + waitStatus = condition_.wait_for( + lock, std::chrono::milliseconds(TIMEOUT_IN_MILLISECONDS), + [time, this]() { + return ((GET_TIME() > time + TIMEOUT_IN_MILLISECONDS) | + (!running_)); + }); + } while (waitStatus != true); } if (running_) { gave_up_ = true;