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