blob: 82d0feef4dc5c82c08d46de785e20ce663f22a5a [file] [log] [blame]
Ian Rogersef7d42f2014-01-06 12:55:46 -08001/*
2 * Copyright (C) 2014 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17#ifndef ART_RUNTIME_MONITOR_POOL_H_
18#define ART_RUNTIME_MONITOR_POOL_H_
19
Ian Rogers44d6ff12014-03-06 23:11:11 -080020#ifdef __LP64__
21#include <bitset>
Ian Rogersef7d42f2014-01-06 12:55:46 -080022#include <stdint.h>
23
Ian Rogers44d6ff12014-03-06 23:11:11 -080024#include "monitor.h"
25#include "runtime.h"
26#include "safe_map.h"
27#endif
28
Ian Rogersef7d42f2014-01-06 12:55:46 -080029namespace art {
30
31// Abstraction to keep monitors small enough to fit in a lock word (32bits). On 32bit systems the
32// monitor id loses the alignment bits of the Monitor*.
33class MonitorPool {
34 public:
35 static MonitorPool* Create() {
36#ifndef __LP64__
37 return nullptr;
38#else
39 return new MonitorPool();
40#endif
41 }
42
43 static Monitor* MonitorFromMonitorId(MonitorId mon_id) {
44#ifndef __LP64__
45 return reinterpret_cast<Monitor*>(mon_id << 3);
46#else
47 return Runtime::Current()->GetMonitorPool()->LookupMonitorFromTable(mon_id);
48#endif
49 }
50
51 static MonitorId MonitorIdFromMonitor(Monitor* mon) {
52#ifndef __LP64__
53 return reinterpret_cast<MonitorId>(mon) >> 3;
54#else
55 return mon->GetMonitorId();
56#endif
57 }
58
59 static MonitorId CreateMonitorId(Thread* self, Monitor* mon) {
60#ifndef __LP64__
61 UNUSED(self);
62 return MonitorIdFromMonitor(mon);
63#else
64 return Runtime::Current()->GetMonitorPool()->AllocMonitorIdFromTable(self, mon);
65#endif
66 }
67
68 static void ReleaseMonitorId(MonitorId mon_id) {
69#ifndef __LP64__
70 UNUSED(mon_id);
71#else
72 Runtime::Current()->GetMonitorPool()->ReleaseMonitorIdFromTable(mon_id);
73#endif
74 }
75
76 private:
77#ifdef __LP64__
78 MonitorPool();
79
80 Monitor* LookupMonitorFromTable(MonitorId mon_id);
81
82 MonitorId LookupMonitorIdFromTable(Monitor* mon);
83
84 MonitorId AllocMonitorIdFromTable(Thread* self, Monitor* mon);
85
86 void ReleaseMonitorIdFromTable(MonitorId mon_id);
87
88 ReaderWriterMutex allocated_ids_lock_ DEFAULT_MUTEX_ACQUIRED_AFTER;
89 static constexpr uint32_t kMaxMonitorId = 0xFFFF;
90 std::bitset<kMaxMonitorId> allocated_ids_ GUARDED_BY(allocated_ids_lock_);
91 SafeMap<MonitorId, Monitor*> table_ GUARDED_BY(allocated_ids_lock_);
92#endif
93};
94
95} // namespace art
96
97#endif // ART_RUNTIME_MONITOR_POOL_H_