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