Merge "Fix handling of INSUFFICIENT_RESOURCES in LoadEntry"
This commit is contained in:
committed by
Android (Google) Code Review
commit
92e123d8ea
@@ -152,8 +152,9 @@ CdmResponseType UsageTableHeader::AddEntry(
|
||||
retry_count < kMaxCryptoRetries &&
|
||||
status == INSUFFICIENT_CRYPTO_RESOURCES_3;
|
||||
++retry_count) {
|
||||
uint32_t entry_number_to_delete =
|
||||
int64_t entry_number_to_delete =
|
||||
GetRandomInRange(usage_entry_info_.size());
|
||||
if (entry_number_to_delete < 0) break;
|
||||
DeleteEntry(entry_number_to_delete, file_handle_.get(), metrics);
|
||||
|
||||
status = crypto_session->CreateUsageEntry(usage_entry_number);
|
||||
@@ -215,17 +216,18 @@ CdmResponseType UsageTableHeader::LoadEntry(CryptoSession* crypto_session,
|
||||
crypto_session->LoadUsageEntry(usage_entry_number, usage_entry);
|
||||
|
||||
// If loading a usage entry fails due to insufficient resources, release a
|
||||
// random entry and try again.
|
||||
// random entry different from |usage_entry_number| and try again. If there
|
||||
// are no more entries to release, we fail.
|
||||
for (uint32_t retry_count = 0;
|
||||
retry_count < kMaxCryptoRetries &&
|
||||
status == INSUFFICIENT_CRYPTO_RESOURCES_3;
|
||||
++retry_count) {
|
||||
uint32_t entry_number_to_delete =
|
||||
GetRandomInRange(usage_entry_info_.size());
|
||||
if (usage_entry_number != entry_number_to_delete) {
|
||||
DeleteEntry(entry_number_to_delete, file_handle_.get(), metrics);
|
||||
status = crypto_session->LoadUsageEntry(usage_entry_number, usage_entry);
|
||||
}
|
||||
// Get a random entry from the other entries.
|
||||
int64_t entry_number_to_delete = GetRandomInRangeWithExclusion(
|
||||
usage_entry_info_.size(), usage_entry_number);
|
||||
if (entry_number_to_delete < 0) break;
|
||||
DeleteEntry(entry_number_to_delete, file_handle_.get(), metrics);
|
||||
status = crypto_session->LoadUsageEntry(usage_entry_number, usage_entry);
|
||||
}
|
||||
|
||||
return status;
|
||||
@@ -707,9 +709,26 @@ bool UsageTableHeader::UpgradeUsageInfoFromUsageTable(
|
||||
return NO_ERROR;
|
||||
}
|
||||
|
||||
uint32_t UsageTableHeader::GetRandomInRange(size_t upper_bound_inclusive) {
|
||||
if (upper_bound_inclusive == 0) return 0;
|
||||
return rand() / (RAND_MAX / upper_bound_inclusive + 1);
|
||||
int64_t UsageTableHeader::GetRandomInRange(size_t upper_bound_exclusive) {
|
||||
if (upper_bound_exclusive == 0) {
|
||||
LOGE("upper_bound_exclusive must be > 0.");
|
||||
return -1;
|
||||
}
|
||||
return (int)((double)rand() / ((double)RAND_MAX + 1) * upper_bound_exclusive);
|
||||
}
|
||||
|
||||
int64_t UsageTableHeader::GetRandomInRangeWithExclusion(
|
||||
size_t upper_bound_exclusive, size_t exclude) {
|
||||
if ((upper_bound_exclusive <= 1) ||
|
||||
(exclude >= upper_bound_exclusive)) {
|
||||
LOGE(
|
||||
"upper_bound_exclusive must be > 1 and exclude must be < "
|
||||
"upper_bound_exclusive.");
|
||||
return -1;
|
||||
}
|
||||
uint32_t random = GetRandomInRange(upper_bound_exclusive - 1);
|
||||
if (random >= exclude) random++;
|
||||
return random;
|
||||
}
|
||||
|
||||
// TODO(fredgc): remove when b/65730828 is addressed
|
||||
|
||||
Reference in New Issue
Block a user