Was using TimedWait for the initial wait, but this can return
early if the process receives any interrupt (due to futex). The
solution is to use a wait loop. If the wait returned early, not
enough classes were including in the profile. This negatively
affected application launch times in some scenarios.
Sample wait times before the change:
Waited 2.002s
Waited 97.808ms
Waited 182.676ms
Waited 2.000s
Waited 1.678s
Bug:
27688727
(cherry picked from commit
0ec065d55ccc4eb0956b0a2231bcc8c1a6d1d273)
Change-Id: I7cfdda9dcff942c7618d6022a0c31f872fb76fcf
// classes save (unless they started before the initial saving was done).
{
MutexLock mu(self, wait_lock_);
- period_condition_.TimedWait(self, kSaveResolvedClassesDelayMs, 0);
+ constexpr uint64_t kSleepTime = kSaveResolvedClassesDelayMs;
+ const uint64_t end_time = NanoTime() + MsToNs(kSleepTime);
+ while (true) {
+ const uint64_t current_time = NanoTime();
+ if (current_time >= end_time) {
+ break;
+ }
+ period_condition_.TimedWait(self, NsToMs(end_time - current_time), 0);
+ }
total_ms_of_sleep_ += kSaveResolvedClassesDelayMs;
}
FetchAndCacheResolvedClasses();