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