1d9c4fc94fa618617f94e1de9af5f034549100753Ian Rogers/* 2d9c4fc94fa618617f94e1de9af5f034549100753Ian Rogers * Copyright (C) 2011 The Android Open Source Project 3d9c4fc94fa618617f94e1de9af5f034549100753Ian Rogers * 4d9c4fc94fa618617f94e1de9af5f034549100753Ian Rogers * Licensed under the Apache License, Version 2.0 (the "License"); 5d9c4fc94fa618617f94e1de9af5f034549100753Ian Rogers * you may not use this file except in compliance with the License. 6d9c4fc94fa618617f94e1de9af5f034549100753Ian Rogers * You may obtain a copy of the License at 7d9c4fc94fa618617f94e1de9af5f034549100753Ian Rogers * 8d9c4fc94fa618617f94e1de9af5f034549100753Ian Rogers * http://www.apache.org/licenses/LICENSE-2.0 9d9c4fc94fa618617f94e1de9af5f034549100753Ian Rogers * 10d9c4fc94fa618617f94e1de9af5f034549100753Ian Rogers * Unless required by applicable law or agreed to in writing, software 11d9c4fc94fa618617f94e1de9af5f034549100753Ian Rogers * distributed under the License is distributed on an "AS IS" BASIS, 12d9c4fc94fa618617f94e1de9af5f034549100753Ian Rogers * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13d9c4fc94fa618617f94e1de9af5f034549100753Ian Rogers * See the License for the specific language governing permissions and 14d9c4fc94fa618617f94e1de9af5f034549100753Ian Rogers * limitations under the License. 15d9c4fc94fa618617f94e1de9af5f034549100753Ian Rogers */ 16d9c4fc94fa618617f94e1de9af5f034549100753Ian Rogers 17d9c4fc94fa618617f94e1de9af5f034549100753Ian Rogers#ifndef ART_RUNTIME_LOCK_WORD_INL_H_ 18d9c4fc94fa618617f94e1de9af5f034549100753Ian Rogers#define ART_RUNTIME_LOCK_WORD_INL_H_ 19d9c4fc94fa618617f94e1de9af5f034549100753Ian Rogers 20d9c4fc94fa618617f94e1de9af5f034549100753Ian Rogers#include "lock_word.h" 21ef7d42fca18c16fbaf103822ad16f23246e2905dIan Rogers#include "monitor_pool.h" 22d9c4fc94fa618617f94e1de9af5f034549100753Ian Rogers 23d9c4fc94fa618617f94e1de9af5f034549100753Ian Rogersnamespace art { 24d9c4fc94fa618617f94e1de9af5f034549100753Ian Rogers 25d9c4fc94fa618617f94e1de9af5f034549100753Ian Rogersinline uint32_t LockWord::ThinLockOwner() const { 26d9c4fc94fa618617f94e1de9af5f034549100753Ian Rogers DCHECK_EQ(GetState(), kThinLocked); 27e15ea086439b41a805d164d2beb07b4ba96aaa97Hiroshi Yamauchi CheckReadBarrierState(); 28d9c4fc94fa618617f94e1de9af5f034549100753Ian Rogers return (value_ >> kThinLockOwnerShift) & kThinLockOwnerMask; 29d9c4fc94fa618617f94e1de9af5f034549100753Ian Rogers} 30d9c4fc94fa618617f94e1de9af5f034549100753Ian Rogers 31d9c4fc94fa618617f94e1de9af5f034549100753Ian Rogersinline uint32_t LockWord::ThinLockCount() const { 32d9c4fc94fa618617f94e1de9af5f034549100753Ian Rogers DCHECK_EQ(GetState(), kThinLocked); 33e15ea086439b41a805d164d2beb07b4ba96aaa97Hiroshi Yamauchi CheckReadBarrierState(); 34d9c4fc94fa618617f94e1de9af5f034549100753Ian Rogers return (value_ >> kThinLockCountShift) & kThinLockCountMask; 35d9c4fc94fa618617f94e1de9af5f034549100753Ian Rogers} 36d9c4fc94fa618617f94e1de9af5f034549100753Ian Rogers 37d9c4fc94fa618617f94e1de9af5f034549100753Ian Rogersinline Monitor* LockWord::FatLockMonitor() const { 38d9c4fc94fa618617f94e1de9af5f034549100753Ian Rogers DCHECK_EQ(GetState(), kFatLocked); 39e15ea086439b41a805d164d2beb07b4ba96aaa97Hiroshi Yamauchi CheckReadBarrierState(); 40e15ea086439b41a805d164d2beb07b4ba96aaa97Hiroshi Yamauchi MonitorId mon_id = (value_ >> kMonitorIdShift) & kMonitorIdMask; 41ef7d42fca18c16fbaf103822ad16f23246e2905dIan Rogers return MonitorPool::MonitorFromMonitorId(mon_id); 42d9c4fc94fa618617f94e1de9af5f034549100753Ian Rogers} 43d9c4fc94fa618617f94e1de9af5f034549100753Ian Rogers 44590fee9e8972f872301c2d16a575d579ee564beeMathieu Chartierinline size_t LockWord::ForwardingAddress() const { 45590fee9e8972f872301c2d16a575d579ee564beeMathieu Chartier DCHECK_EQ(GetState(), kForwardingAddress); 46277ccbd200ea43590dfc06a93ae184a765327ad0Andreas Gampe return value_ << kStateSize; 47590fee9e8972f872301c2d16a575d579ee564beeMathieu Chartier} 48590fee9e8972f872301c2d16a575d579ee564beeMathieu Chartier 49d9c4fc94fa618617f94e1de9af5f034549100753Ian Rogersinline LockWord::LockWord() : value_(0) { 50d9c4fc94fa618617f94e1de9af5f034549100753Ian Rogers DCHECK_EQ(GetState(), kUnlocked); 51d9c4fc94fa618617f94e1de9af5f034549100753Ian Rogers} 52d9c4fc94fa618617f94e1de9af5f034549100753Ian Rogers 53e15ea086439b41a805d164d2beb07b4ba96aaa97Hiroshi Yamauchiinline LockWord::LockWord(Monitor* mon, uint32_t rb_state) 54e15ea086439b41a805d164d2beb07b4ba96aaa97Hiroshi Yamauchi : value_(mon->GetMonitorId() | (rb_state << kReadBarrierStateShift) | 55e15ea086439b41a805d164d2beb07b4ba96aaa97Hiroshi Yamauchi (kStateFat << kStateShift)) { 5660f63f53c01cb38ca18a815603282e802a6cf918Hiroshi Yamauchi DCHECK_EQ(rb_state & ~kReadBarrierStateMask, 0U); 57e15ea086439b41a805d164d2beb07b4ba96aaa97Hiroshi Yamauchi#ifndef __LP64__ 58e15ea086439b41a805d164d2beb07b4ba96aaa97Hiroshi Yamauchi DCHECK_ALIGNED(mon, kMonitorIdAlignment); 59e15ea086439b41a805d164d2beb07b4ba96aaa97Hiroshi Yamauchi#endif 60d9c4fc94fa618617f94e1de9af5f034549100753Ian Rogers DCHECK_EQ(FatLockMonitor(), mon); 61d8481ccad5b33aa9783cd8f7c614ee083a4f1cccnikolay serdjuk DCHECK_LE(mon->GetMonitorId(), static_cast<uint32_t>(kMaxMonitorId)); 62e15ea086439b41a805d164d2beb07b4ba96aaa97Hiroshi Yamauchi CheckReadBarrierState(); 63d9c4fc94fa618617f94e1de9af5f034549100753Ian Rogers} 64d9c4fc94fa618617f94e1de9af5f034549100753Ian Rogers 654e6a31eb97f22f4480827474b30b9e64f396eaceMathieu Chartierinline int32_t LockWord::GetHashCode() const { 66ad2541a59c00c2c69e8973088891a2b5257c9780Mathieu Chartier DCHECK_EQ(GetState(), kHashCode); 67e15ea086439b41a805d164d2beb07b4ba96aaa97Hiroshi Yamauchi CheckReadBarrierState(); 68ad2541a59c00c2c69e8973088891a2b5257c9780Mathieu Chartier return (value_ >> kHashShift) & kHashMask; 69ad2541a59c00c2c69e8973088891a2b5257c9780Mathieu Chartier} 70ad2541a59c00c2c69e8973088891a2b5257c9780Mathieu Chartier 71d9c4fc94fa618617f94e1de9af5f034549100753Ian Rogers} // namespace art 72d9c4fc94fa618617f94e1de9af5f034549100753Ian Rogers 73d9c4fc94fa618617f94e1de9af5f034549100753Ian Rogers#endif // ART_RUNTIME_LOCK_WORD_INL_H_ 74