diff options
Diffstat (limited to 'runtime/thread.cc')
| -rw-r--r-- | runtime/thread.cc | 10 |
1 files changed, 7 insertions, 3 deletions
diff --git a/runtime/thread.cc b/runtime/thread.cc index 66e852a216..e9fed76d6f 100644 --- a/runtime/thread.cc +++ b/runtime/thread.cc @@ -302,8 +302,9 @@ void Thread::Park(bool is_absolute, int64_t time) { int old_state = tls32_.park_state_.fetch_add(1, std::memory_order_relaxed); if (old_state == kNoPermit) { // no permit was available. block thread until later. - // TODO: Call to signal jvmti here + Runtime::Current()->GetRuntimeCallbacks()->ThreadParkStart(is_absolute, time); int result = 0; + bool timed_out = false; if (!is_absolute && time == 0) { // Thread.getState() is documented to return waiting for untimed parks. ScopedThreadSuspension sts(this, ThreadState::kWaiting); @@ -351,8 +352,10 @@ void Thread::Park(bool is_absolute, int64_t time) { } if (result == -1) { switch (errno) { - case EAGAIN: case ETIMEDOUT: + timed_out = true; + FALLTHROUGH_INTENDED; + case EAGAIN: case EINTR: break; // park() is allowed to spuriously return default: PLOG(FATAL) << "Failed to park"; } @@ -360,6 +363,7 @@ void Thread::Park(bool is_absolute, int64_t time) { // Mark as no longer waiting, and consume permit if there is one. tls32_.park_state_.store(kNoPermit, std::memory_order_relaxed); // TODO: Call to signal jvmti here + Runtime::Current()->GetRuntimeCallbacks()->ThreadParkFinished(timed_out); } else { // the fetch_add has consumed the permit. immediately return. DCHECK_EQ(old_state, kPermitAvailable); @@ -2250,7 +2254,7 @@ Thread::Thread(bool daemon) : tls32_(daemon), wait_monitor_(nullptr), is_runtime_thread_(false) { - wait_mutex_ = new Mutex("a thread wait mutex"); + wait_mutex_ = new Mutex("a thread wait mutex", LockLevel::kThreadWaitLock); wait_cond_ = new ConditionVariable("a thread wait condition variable", *wait_mutex_); tlsPtr_.instrumentation_stack = new std::deque<instrumentation::InstrumentationStackFrame>; tlsPtr_.name = new std::string(kThreadNameDuringStartup); |