diff options
author | Ian Rogers <irogers@google.com> | 2014-08-15 11:09:28 -0700 |
---|---|---|
committer | Ian Rogers <irogers@google.com> | 2014-08-15 11:35:38 -0700 |
commit | 43c69cc4cea794cd4d89d9d0680b1e25c6d02acc (patch) | |
tree | fdfabd74408bc13e4b73674e881ab0ebbfb39d0f /runtime/monitor.h | |
parent | 37f048b19da5ac245a6b2a8473b326d2167cc692 (diff) | |
download | art-43c69cc4cea794cd4d89d9d0680b1e25c6d02acc.zip art-43c69cc4cea794cd4d89d9d0680b1e25c6d02acc.tar.gz art-43c69cc4cea794cd4d89d9d0680b1e25c6d02acc.tar.bz2 |
Make Monitor::Wait more robust to spurious Inflate failures.
Bug: 17062710
Change-Id: Ife5f6b335caacc70cab543cd568676d277d3beb6
(cherry picked from commit 6f22fc166ed6c11cad229bff442c064e704de101)
Diffstat (limited to 'runtime/monitor.h')
-rw-r--r-- | runtime/monitor.h | 7 |
1 files changed, 7 insertions, 0 deletions
diff --git a/runtime/monitor.h b/runtime/monitor.h index 26d43c9..ae14fc1 100644 --- a/runtime/monitor.h +++ b/runtime/monitor.h @@ -117,6 +117,7 @@ class Monitor { return monitor_id_; } + // Inflate the lock on obj. May fail to inflate for spurious reasons, always re-check. static void InflateThinLocked(Thread* self, Handle<mirror::Object> obj, LockWord lock_word, uint32_t hash_code) NO_THREAD_SAFETY_ANALYSIS; @@ -138,6 +139,12 @@ class Monitor { void AppendToWaitSet(Thread* thread) EXCLUSIVE_LOCKS_REQUIRED(monitor_lock_); void RemoveFromWaitSet(Thread* thread) EXCLUSIVE_LOCKS_REQUIRED(monitor_lock_); + /* + * Changes the shape of a monitor from thin to fat, preserving the internal lock state. The + * calling thread must own the lock or the owner must be suspended. There's a race with other + * threads inflating the lock, installing hash codes and spurious failures. The caller should + * re-read the lock word following the call. + */ static void Inflate(Thread* self, Thread* owner, mirror::Object* obj, int32_t hash_code) SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); |