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
Bug: 19268145
(cherry picked from commit 071e48ecfc95b1c67b07c975190d51f646ac4276)
Change-Id: I68fa5afda75e53373e836dd7779821aeb6f1bd46
(cherry picked from commit 7d9ad8bb71df2b1dc957121ef2ebee69d96f8e0c)
diff --git a/runtime/base/mutex.cc b/runtime/base/mutex.cc
index 9b97411..0d747c3 100644
--- a/runtime/base/mutex.cc
+++ b/runtime/base/mutex.cc
@@ -555,7 +555,7 @@
#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) {
@@ -564,7 +564,7 @@
} 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.