diff options
author | Hiroshi Yamauchi <yamauchi@google.com> | 2015-02-09 17:11:42 -0800 |
---|---|---|
committer | Hiroshi Yamauchi <yamauchi@google.com> | 2015-03-03 17:33:18 -0800 |
commit | e15ea086439b41a805d164d2beb07b4ba96aaa97 (patch) | |
tree | 465ee3780acd8b7cb35c8a7f42a1f3c5df3d26ec /runtime/monitor.h | |
parent | 0b25c71ac93fb10c484dbacb9e23db505a8e2353 (diff) | |
download | art-e15ea086439b41a805d164d2beb07b4ba96aaa97.zip art-e15ea086439b41a805d164d2beb07b4ba96aaa97.tar.gz art-e15ea086439b41a805d164d2beb07b4ba96aaa97.tar.bz2 |
Reserve bits in the lock word for read barriers.
This prepares for the CC collector to use the standard object header
model by storing the read barrier state in the lock word.
Bug: 19355854
Bug: 12687968
Change-Id: Ia7585662dd2cebf0479a3e74f734afe5059fb70f
Diffstat (limited to 'runtime/monitor.h')
-rw-r--r-- | runtime/monitor.h | 13 |
1 files changed, 13 insertions, 0 deletions
diff --git a/runtime/monitor.h b/runtime/monitor.h index 0c5f8a4..2e065ae 100644 --- a/runtime/monitor.h +++ b/runtime/monitor.h @@ -22,12 +22,16 @@ #include <iosfwd> #include <list> +#ifndef __LP64__ +#include <malloc.h> // For memalign. +#endif #include <vector> #include "atomic.h" #include "base/allocator.h" #include "base/mutex.h" #include "gc_root.h" +#include "lock_word.h" #include "object_callbacks.h" #include "read_barrier_option.h" #include "thread_state.h" @@ -127,8 +131,17 @@ class Monitor { uint32_t hash_code) NO_THREAD_SAFETY_ANALYSIS; static bool Deflate(Thread* self, mirror::Object* obj) + // Not exclusive because ImageWriter calls this during a Heap::VisitObjects() that + // does not allow a thread suspension in the middle. TODO: maybe make this exclusive. SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); +#ifndef __LP64__ + void* operator new(size_t size) { + // Align Monitor* as per the monitor ID field size in the lock word. + return memalign(LockWord::kMonitorIdAlignment, size); + } +#endif + private: explicit Monitor(Thread* self, Thread* owner, mirror::Object* obj, int32_t hash_code) SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); |