diff options
Diffstat (limited to 'runtime/mirror/object-inl.h')
-rw-r--r-- | runtime/mirror/object-inl.h | 25 |
1 files changed, 23 insertions, 2 deletions
diff --git a/runtime/mirror/object-inl.h b/runtime/mirror/object-inl.h index 5ed3db342c..e6591088ef 100644 --- a/runtime/mirror/object-inl.h +++ b/runtime/mirror/object-inl.h @@ -24,6 +24,7 @@ #include "atomic.h" #include "array-inl.h" #include "class.h" +#include "lock_word-inl.h" #include "monitor.h" #include "runtime.h" #include "throwable.h" @@ -43,8 +44,21 @@ inline void Object::SetClass(Class* new_klass) { SetFieldPtr(OFFSET_OF_OBJECT_MEMBER(Object, klass_), new_klass, false, false); } -inline uint32_t Object::GetThinLockId() { - return Monitor::GetThinLockId(monitor_); +inline LockWord Object::GetLockWord() { + return LockWord(GetField32(OFFSET_OF_OBJECT_MEMBER(Object, monitor_), true)); +} + +inline void Object::SetLockWord(LockWord new_val) { + SetField32(OFFSET_OF_OBJECT_MEMBER(Object, monitor_), new_val.GetValue(), true); +} + +inline bool Object::CasLockWord(LockWord old_val, LockWord new_val) { + return CasField32(OFFSET_OF_OBJECT_MEMBER(Object, monitor_), old_val.GetValue(), + new_val.GetValue()); +} + +inline uint32_t Object::GetLockOwnerThreadId() { + return Monitor::GetLockOwnerThreadId(this); } inline void Object::MonitorEnter(Thread* self) { @@ -238,6 +252,13 @@ inline size_t Object::SizeOf() const { return result; } +inline bool Object::CasField32(MemberOffset field_offset, uint32_t old_value, uint32_t new_value) { + VerifyObject(this); + byte* raw_addr = reinterpret_cast<byte*>(this) + field_offset.Int32Value(); + int32_t* addr = reinterpret_cast<int32_t*>(raw_addr); + return android_atomic_release_cas(old_value, new_value, addr) == 0; +} + inline uint64_t Object::GetField64(MemberOffset field_offset, bool is_volatile) const { VerifyObject(this); const byte* raw_addr = reinterpret_cast<const byte*>(this) + field_offset.Int32Value(); |