monitor_pool.h revision b0fa5dc7769c1e054032f39de0a3f6d6dd06f8cf
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 20b0fa5dc7769c1e054032f39de0a3f6d6dd06f8cfIan Rogers#include "monitor.h" 21b0fa5dc7769c1e054032f39de0a3f6d6dd06f8cfIan Rogers 2244d6ff197b340b5ac2a4094db148b39c366317ddIan Rogers#ifdef __LP64__ 2344d6ff197b340b5ac2a4094db148b39c366317ddIan Rogers#include <bitset> 2444d6ff197b340b5ac2a4094db148b39c366317ddIan Rogers#include <stdint.h> 25ef7d42fca18c16fbaf103822ad16f23246e2905dIan Rogers 2644d6ff197b340b5ac2a4094db148b39c366317ddIan Rogers#include "runtime.h" 27ef7d42fca18c16fbaf103822ad16f23246e2905dIan Rogers#include "safe_map.h" 2844d6ff197b340b5ac2a4094db148b39c366317ddIan Rogers#endif 29ef7d42fca18c16fbaf103822ad16f23246e2905dIan Rogers 30ef7d42fca18c16fbaf103822ad16f23246e2905dIan Rogersnamespace art { 31ef7d42fca18c16fbaf103822ad16f23246e2905dIan Rogers 32ef7d42fca18c16fbaf103822ad16f23246e2905dIan Rogers// Abstraction to keep monitors small enough to fit in a lock word (32bits). On 32bit systems the 33ef7d42fca18c16fbaf103822ad16f23246e2905dIan Rogers// monitor id loses the alignment bits of the Monitor*. 34ef7d42fca18c16fbaf103822ad16f23246e2905dIan Rogersclass MonitorPool { 35ef7d42fca18c16fbaf103822ad16f23246e2905dIan Rogers public: 36ef7d42fca18c16fbaf103822ad16f23246e2905dIan Rogers static MonitorPool* Create() { 37ef7d42fca18c16fbaf103822ad16f23246e2905dIan Rogers#ifndef __LP64__ 38ef7d42fca18c16fbaf103822ad16f23246e2905dIan Rogers return nullptr; 39ef7d42fca18c16fbaf103822ad16f23246e2905dIan Rogers#else 40ef7d42fca18c16fbaf103822ad16f23246e2905dIan Rogers return new MonitorPool(); 41ef7d42fca18c16fbaf103822ad16f23246e2905dIan Rogers#endif 42ef7d42fca18c16fbaf103822ad16f23246e2905dIan Rogers } 43ef7d42fca18c16fbaf103822ad16f23246e2905dIan Rogers 44ef7d42fca18c16fbaf103822ad16f23246e2905dIan Rogers static Monitor* MonitorFromMonitorId(MonitorId mon_id) { 45ef7d42fca18c16fbaf103822ad16f23246e2905dIan Rogers#ifndef __LP64__ 46ef7d42fca18c16fbaf103822ad16f23246e2905dIan Rogers return reinterpret_cast<Monitor*>(mon_id << 3); 47ef7d42fca18c16fbaf103822ad16f23246e2905dIan Rogers#else 48ef7d42fca18c16fbaf103822ad16f23246e2905dIan Rogers return Runtime::Current()->GetMonitorPool()->LookupMonitorFromTable(mon_id); 49ef7d42fca18c16fbaf103822ad16f23246e2905dIan Rogers#endif 50ef7d42fca18c16fbaf103822ad16f23246e2905dIan Rogers } 51ef7d42fca18c16fbaf103822ad16f23246e2905dIan Rogers 52ef7d42fca18c16fbaf103822ad16f23246e2905dIan Rogers static MonitorId MonitorIdFromMonitor(Monitor* mon) { 53ef7d42fca18c16fbaf103822ad16f23246e2905dIan Rogers#ifndef __LP64__ 54ef7d42fca18c16fbaf103822ad16f23246e2905dIan Rogers return reinterpret_cast<MonitorId>(mon) >> 3; 55ef7d42fca18c16fbaf103822ad16f23246e2905dIan Rogers#else 56ef7d42fca18c16fbaf103822ad16f23246e2905dIan Rogers return mon->GetMonitorId(); 57ef7d42fca18c16fbaf103822ad16f23246e2905dIan Rogers#endif 58ef7d42fca18c16fbaf103822ad16f23246e2905dIan Rogers } 59ef7d42fca18c16fbaf103822ad16f23246e2905dIan Rogers 60ef7d42fca18c16fbaf103822ad16f23246e2905dIan Rogers static MonitorId CreateMonitorId(Thread* self, Monitor* mon) { 61ef7d42fca18c16fbaf103822ad16f23246e2905dIan Rogers#ifndef __LP64__ 62ef7d42fca18c16fbaf103822ad16f23246e2905dIan Rogers UNUSED(self); 63ef7d42fca18c16fbaf103822ad16f23246e2905dIan Rogers return MonitorIdFromMonitor(mon); 64ef7d42fca18c16fbaf103822ad16f23246e2905dIan Rogers#else 65ef7d42fca18c16fbaf103822ad16f23246e2905dIan Rogers return Runtime::Current()->GetMonitorPool()->AllocMonitorIdFromTable(self, mon); 66ef7d42fca18c16fbaf103822ad16f23246e2905dIan Rogers#endif 67ef7d42fca18c16fbaf103822ad16f23246e2905dIan Rogers } 68ef7d42fca18c16fbaf103822ad16f23246e2905dIan Rogers 69ef7d42fca18c16fbaf103822ad16f23246e2905dIan Rogers static void ReleaseMonitorId(MonitorId mon_id) { 70ef7d42fca18c16fbaf103822ad16f23246e2905dIan Rogers#ifndef __LP64__ 71ef7d42fca18c16fbaf103822ad16f23246e2905dIan Rogers UNUSED(mon_id); 72ef7d42fca18c16fbaf103822ad16f23246e2905dIan Rogers#else 73ef7d42fca18c16fbaf103822ad16f23246e2905dIan Rogers Runtime::Current()->GetMonitorPool()->ReleaseMonitorIdFromTable(mon_id); 74ef7d42fca18c16fbaf103822ad16f23246e2905dIan Rogers#endif 75ef7d42fca18c16fbaf103822ad16f23246e2905dIan Rogers } 76ef7d42fca18c16fbaf103822ad16f23246e2905dIan Rogers 77ef7d42fca18c16fbaf103822ad16f23246e2905dIan Rogers private: 78ef7d42fca18c16fbaf103822ad16f23246e2905dIan Rogers#ifdef __LP64__ 79ef7d42fca18c16fbaf103822ad16f23246e2905dIan Rogers MonitorPool(); 80ef7d42fca18c16fbaf103822ad16f23246e2905dIan Rogers 81ef7d42fca18c16fbaf103822ad16f23246e2905dIan Rogers Monitor* LookupMonitorFromTable(MonitorId mon_id); 82ef7d42fca18c16fbaf103822ad16f23246e2905dIan Rogers 83ef7d42fca18c16fbaf103822ad16f23246e2905dIan Rogers MonitorId LookupMonitorIdFromTable(Monitor* mon); 84ef7d42fca18c16fbaf103822ad16f23246e2905dIan Rogers 85ef7d42fca18c16fbaf103822ad16f23246e2905dIan Rogers MonitorId AllocMonitorIdFromTable(Thread* self, Monitor* mon); 86ef7d42fca18c16fbaf103822ad16f23246e2905dIan Rogers 87ef7d42fca18c16fbaf103822ad16f23246e2905dIan Rogers void ReleaseMonitorIdFromTable(MonitorId mon_id); 88ef7d42fca18c16fbaf103822ad16f23246e2905dIan Rogers 89ef7d42fca18c16fbaf103822ad16f23246e2905dIan Rogers ReaderWriterMutex allocated_ids_lock_ DEFAULT_MUTEX_ACQUIRED_AFTER; 90ef7d42fca18c16fbaf103822ad16f23246e2905dIan Rogers static constexpr uint32_t kMaxMonitorId = 0xFFFF; 91ef7d42fca18c16fbaf103822ad16f23246e2905dIan Rogers std::bitset<kMaxMonitorId> allocated_ids_ GUARDED_BY(allocated_ids_lock_); 92ef7d42fca18c16fbaf103822ad16f23246e2905dIan Rogers SafeMap<MonitorId, Monitor*> table_ GUARDED_BY(allocated_ids_lock_); 93ef7d42fca18c16fbaf103822ad16f23246e2905dIan Rogers#endif 94ef7d42fca18c16fbaf103822ad16f23246e2905dIan Rogers}; 95ef7d42fca18c16fbaf103822ad16f23246e2905dIan Rogers 96ef7d42fca18c16fbaf103822ad16f23246e2905dIan Rogers} // namespace art 97ef7d42fca18c16fbaf103822ad16f23246e2905dIan Rogers 98ef7d42fca18c16fbaf103822ad16f23246e2905dIan Rogers#endif // ART_RUNTIME_MONITOR_POOL_H_ 99