From 7d9ad8bb71df2b1dc957121ef2ebee69d96f8e0c Mon Sep 17 00:00:00 2001 From: "tony.ys_liu" Date: Wed, 14 Jan 2015 18:28:03 +0800 Subject: [PATCH] Fix false alarm on thread suspend timeout Root cause: CLOCK_REALTIME will jump backward/forward when system time-of-day clock is changed. It implies now_abs_ts will jump a lot across end_abs_ts. Then, it makes a false alarm (process crash) on thread suspend timeout when doing ComputeRelativeTimeSpec. if (ComputeRelativeTimeSpec(&rel_ts, end_abs_ts, now_abs_ts)) { return false; // Timed out. } Solution: Use CLOCK_MONOTONIC instead Bug: 19296054 (cherry picked from commit 071e48ecfc95b1c67b07c975190d51f646ac4276) Change-Id: I68fa5afda75e53373e836dd7779821aeb6f1bd46 --- runtime/base/mutex.cc | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/runtime/base/mutex.cc b/runtime/base/mutex.cc index 3f015de6f..be29a733e 100644 --- a/runtime/base/mutex.cc +++ b/runtime/base/mutex.cc @@ -563,7 +563,7 @@ bool ReaderWriterMutex::ExclusiveLockWithTimeout(Thread* self, int64_t ms, int32 #if ART_USE_FUTEXES bool done = false; timespec end_abs_ts; - InitTimeSpec(true, CLOCK_REALTIME, ms, ns, &end_abs_ts); + InitTimeSpec(true, CLOCK_MONOTONIC, ms, ns, &end_abs_ts); do { int32_t cur_state = state_.LoadRelaxed(); if (cur_state == 0) { @@ -572,7 +572,7 @@ bool ReaderWriterMutex::ExclusiveLockWithTimeout(Thread* self, int64_t ms, int32 } else { // Failed to acquire, hang up. timespec now_abs_ts; - InitTimeSpec(true, CLOCK_REALTIME, 0, 0, &now_abs_ts); + InitTimeSpec(true, CLOCK_MONOTONIC, 0, 0, &now_abs_ts); timespec rel_ts; if (ComputeRelativeTimeSpec(&rel_ts, end_abs_ts, now_abs_ts)) { return false; // Timed out. -- 2.11.0