Add watch dog timer to OEMCrypto L3
Merge from Widevine repo of http://go/wvgerrit/29861 This code adds a watchdog timer to the oemcrypto initialization. If initialization does not finish within 5 seconds, the process will abort. For branch oc-dr1-dev, unlike nyc-mr2-dev, we save a metric indicating there was a failure. Testing: see code in patch 1. Watch dog was forced while using Play Movies. The busy spinner spun for at least 5 seconds, but Play Movies was able to restart itself. b/62106796 Change-Id: Ib59f5bc4a484eff1dc386e07a4b198ecb713c69b
This commit is contained in:
committed by
Jeff Tinker
parent
a81caa5bf1
commit
08debe83c2
@@ -418,19 +418,10 @@ class Adapter {
|
|||||||
~Adapter() {
|
~Adapter() {
|
||||||
}
|
}
|
||||||
|
|
||||||
OEMCryptoResult Initialize() {
|
OEMCryptoResult Initialize(wvcdm::metrics::CryptoMetrics* metrics) {
|
||||||
|
if (metrics == nullptr) {
|
||||||
/*
|
return OEMCrypto_ERROR_INIT_FAILED;
|
||||||
* To avoid changing the function signature and function contract - declare
|
}
|
||||||
* a one-off metrics group to collect detailed information about how
|
|
||||||
* oemcrypto was intialized.
|
|
||||||
*
|
|
||||||
* TODO(blueeyes): Refactor this to allow Initialize to provide the
|
|
||||||
* details to the caller or to use the metrics instance provided by
|
|
||||||
* the caller.
|
|
||||||
*/
|
|
||||||
wvcdm::metrics::CryptoMetrics metrics;
|
|
||||||
|
|
||||||
level1_ = FunctionPointers(); // start with all null pointers.
|
level1_ = FunctionPointers(); // start with all null pointers.
|
||||||
level3_ = FunctionPointers(); // start with all null pointers.
|
level3_ = FunctionPointers(); // start with all null pointers.
|
||||||
LoadLevel3();
|
LoadLevel3();
|
||||||
@@ -441,7 +432,7 @@ class Adapter {
|
|||||||
base_path.c_str());
|
base_path.c_str());
|
||||||
if (Level3_IsInApp()) {
|
if (Level3_IsInApp()) {
|
||||||
M_RECORD(
|
M_RECORD(
|
||||||
&metrics,
|
metrics,
|
||||||
oemcrypto_initialization_mode_,
|
oemcrypto_initialization_mode_,
|
||||||
NO_TIME,
|
NO_TIME,
|
||||||
wvcdm::metrics::OEMCrypto_INITIALIZED_USING_IN_APP);
|
wvcdm::metrics::OEMCrypto_INITIALIZED_USING_IN_APP);
|
||||||
@@ -450,7 +441,7 @@ class Adapter {
|
|||||||
if (force_level3()) {
|
if (force_level3()) {
|
||||||
LOGW("Test code. User requested falling back to L3");
|
LOGW("Test code. User requested falling back to L3");
|
||||||
M_RECORD(
|
M_RECORD(
|
||||||
&metrics,
|
metrics,
|
||||||
oemcrypto_initialization_mode_,
|
oemcrypto_initialization_mode_,
|
||||||
NO_TIME,
|
NO_TIME,
|
||||||
wvcdm::metrics::OEMCrypto_INITIALIZED_FORCING_L3);
|
wvcdm::metrics::OEMCrypto_INITIALIZED_FORCING_L3);
|
||||||
@@ -460,7 +451,7 @@ class Adapter {
|
|||||||
if (!wvcdm::Properties::GetOEMCryptoPath(&library_name)) {
|
if (!wvcdm::Properties::GetOEMCryptoPath(&library_name)) {
|
||||||
LOGW("L1 library not specified. Falling back to L3");
|
LOGW("L1 library not specified. Falling back to L3");
|
||||||
M_RECORD(
|
M_RECORD(
|
||||||
&metrics,
|
metrics,
|
||||||
oemcrypto_initialization_mode_,
|
oemcrypto_initialization_mode_,
|
||||||
NO_TIME,
|
NO_TIME,
|
||||||
wvcdm::metrics::OEMCrypto_INITIALIZED_USING_L3_NO_L1_LIBRARY_PATH);
|
wvcdm::metrics::OEMCrypto_INITIALIZED_USING_L3_NO_L1_LIBRARY_PATH);
|
||||||
@@ -471,13 +462,13 @@ class Adapter {
|
|||||||
LOGW("Could not load %s. Falling back to L3. %s", library_name.c_str(),
|
LOGW("Could not load %s. Falling back to L3. %s", library_name.c_str(),
|
||||||
dlerror());
|
dlerror());
|
||||||
M_RECORD(
|
M_RECORD(
|
||||||
&metrics,
|
metrics,
|
||||||
oemcrypto_initialization_mode_,
|
oemcrypto_initialization_mode_,
|
||||||
NO_TIME,
|
NO_TIME,
|
||||||
wvcdm::metrics::OEMCrypto_INITIALIZED_USING_L3_L1_OPEN_FAILED);
|
wvcdm::metrics::OEMCrypto_INITIALIZED_USING_L3_L1_OPEN_FAILED);
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
if (LoadLevel1(&metrics)) {
|
if (LoadLevel1(metrics)) {
|
||||||
LOGD("OEMCrypto_Initialize Level 1 success. I will use level 1.");
|
LOGD("OEMCrypto_Initialize Level 1 success. I will use level 1.");
|
||||||
} else {
|
} else {
|
||||||
level1_ = FunctionPointers(); // revert to all null pointers.
|
level1_ = FunctionPointers(); // revert to all null pointers.
|
||||||
@@ -489,6 +480,9 @@ class Adapter {
|
|||||||
}
|
}
|
||||||
|
|
||||||
bool LoadLevel1(wvcdm::metrics::CryptoMetrics* metrics) {
|
bool LoadLevel1(wvcdm::metrics::CryptoMetrics* metrics) {
|
||||||
|
if (metrics == nullptr) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
level1_valid_ = true;
|
level1_valid_ = true;
|
||||||
const uint32_t kMinimumVersion = 8;
|
const uint32_t kMinimumVersion = 8;
|
||||||
const uint32_t kMaximumVersion = 13;
|
const uint32_t kMaximumVersion = 13;
|
||||||
@@ -885,7 +879,7 @@ class WatchDog {
|
|||||||
delete kAdapter;
|
delete kAdapter;
|
||||||
}
|
}
|
||||||
kAdapter = new Adapter();
|
kAdapter = new Adapter();
|
||||||
status_ = kAdapter->Initialize();
|
status_ = kAdapter->Initialize(&metrics_);
|
||||||
}
|
}
|
||||||
|
|
||||||
std::string FailureFilename() {
|
std::string FailureFilename() {
|
||||||
@@ -913,6 +907,11 @@ class WatchDog {
|
|||||||
file_system.Remove(filename);
|
file_system.Remove(filename);
|
||||||
if (size == size_read && flag) {
|
if (size == size_read && flag) {
|
||||||
LOGE("Previous L3 Init failed.");
|
LOGE("Previous L3 Init failed.");
|
||||||
|
M_RECORD(
|
||||||
|
&metrics_,
|
||||||
|
oemcrypto_initialization_mode_,
|
||||||
|
NO_TIME,
|
||||||
|
wvcdm::metrics::OEMCrypto_INITIALIZED_L3_INITIALIZATION_FAILED);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -990,6 +989,15 @@ class WatchDog {
|
|||||||
pthread_cond_t condition_;
|
pthread_cond_t condition_;
|
||||||
bool running_;
|
bool running_;
|
||||||
bool gave_up_;
|
bool gave_up_;
|
||||||
|
// A Metrics Group for the different initialization outcomes. Since one
|
||||||
|
// outcome is a watchdog timeout and abort on the PREVIOUS initialization,
|
||||||
|
// we put the group here, owned by the watchdog timer.
|
||||||
|
//
|
||||||
|
// TODO(blueeyes): Refactor this to allow Initialize to provide the
|
||||||
|
// details to the caller or to use the metrics instance provided by
|
||||||
|
// the caller.
|
||||||
|
|
||||||
|
wvcdm::metrics::CryptoMetrics metrics_;
|
||||||
};
|
};
|
||||||
|
|
||||||
// Function called by new worker thread in pthread_create.
|
// Function called by new worker thread in pthread_create.
|
||||||
|
|||||||
@@ -73,7 +73,8 @@ typedef enum OEMCryptoInitializationMode {
|
|||||||
OEMCrypto_INITIALIZED_USING_L3_COULD_NOT_INSTALL_KEYBOX = 12,
|
OEMCrypto_INITIALIZED_USING_L3_COULD_NOT_INSTALL_KEYBOX = 12,
|
||||||
OEMCrypto_INITIALIZED_USING_L1_INSTALLED_KEYBOX = 13,
|
OEMCrypto_INITIALIZED_USING_L1_INSTALLED_KEYBOX = 13,
|
||||||
OEMCrypto_INITIALIZED_USING_L3_INVALID_L1 = 14,
|
OEMCrypto_INITIALIZED_USING_L3_INVALID_L1 = 14,
|
||||||
OEMCrypto_INITIALIZED_USING_L1_WITH_PROVISIONING_3_0 = 15
|
OEMCrypto_INITIALIZED_USING_L1_WITH_PROVISIONING_3_0 = 15,
|
||||||
|
OEMCrypto_INITIALIZED_L3_INITIALIZATION_FAILED = 16
|
||||||
} OEMCryptoInitializationMode;
|
} OEMCryptoInitializationMode;
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user