Index: src/futex-emulation.cc |
diff --git a/src/futex-emulation.cc b/src/futex-emulation.cc |
index b8168a87045f55c0e11dd75d4b4bb4ba0de18cdd..39f43dd7dd8c998e8ec571b5942194827a240f75 100644 |
--- a/src/futex-emulation.cc |
+++ b/src/futex-emulation.cc |
@@ -101,18 +101,25 @@ Object* FutexEmulation::Wait(Isolate* isolate, |
} |
} |
- base::TimeDelta rel_time_left = rel_timeout; |
+ base::Time start_time = base::Time::NowFromSystemTime(); |
+ base::Time timeout_time = start_time + rel_timeout; |
wait_list_.Pointer()->AddNode(node); |
Object* result; |
while (true) { |
- base::TimeDelta time_to_wait = (use_timeout && rel_time_left < kMaxWaitTime) |
- ? rel_time_left |
- : kMaxWaitTime; |
+ base::Time current_time = base::Time::NowFromSystemTime(); |
+ if (use_timeout && current_time > timeout_time) { |
+ result = Smi::FromInt(Result::kTimedOut); |
+ break; |
+ } |
+ |
+ base::TimeDelta time_until_timeout = timeout_time - current_time; |
+ base::TimeDelta time_to_wait = |
+ (use_timeout && time_until_timeout < kMaxWaitTime) ? time_until_timeout |
+ : kMaxWaitTime; |
- base::Time start_time = base::Time::NowFromSystemTime(); |
bool wait_for_result = node->cond_.WaitFor(mutex_.Pointer(), time_to_wait); |
USE(wait_for_result); |
@@ -121,17 +128,8 @@ Object* FutexEmulation::Wait(Isolate* isolate, |
break; |
} |
- // Spurious wakeup or timeout. |
- base::Time end_time = base::Time::NowFromSystemTime(); |
- base::TimeDelta waited_for = end_time - start_time; |
- rel_time_left -= waited_for; |
- |
- if (use_timeout && rel_time_left < base::TimeDelta::FromMicroseconds(0)) { |
- result = Smi::FromInt(Result::kTimedOut); |
- break; |
- } |
- |
- // Potentially handle interrupts before continuing to wait. |
+ // Spurious wakeup or timeout. Potentially handle interrupts before |
+ // continuing to wait. |
Object* interrupt_object = isolate->stack_guard()->HandleInterrupts(); |
if (interrupt_object->IsException()) { |
result = interrupt_object; |