157b86d47b66322693a070185fadfb43cb9c12eabIan Rogers/* 257b86d47b66322693a070185fadfb43cb9c12eabIan Rogers * Copyright (C) 2012 The Android Open Source Project 357b86d47b66322693a070185fadfb43cb9c12eabIan Rogers * 457b86d47b66322693a070185fadfb43cb9c12eabIan Rogers * Licensed under the Apache License, Version 2.0 (the "License"); 557b86d47b66322693a070185fadfb43cb9c12eabIan Rogers * you may not use this file except in compliance with the License. 657b86d47b66322693a070185fadfb43cb9c12eabIan Rogers * You may obtain a copy of the License at 757b86d47b66322693a070185fadfb43cb9c12eabIan Rogers * 857b86d47b66322693a070185fadfb43cb9c12eabIan Rogers * http://www.apache.org/licenses/LICENSE-2.0 957b86d47b66322693a070185fadfb43cb9c12eabIan Rogers * 1057b86d47b66322693a070185fadfb43cb9c12eabIan Rogers * Unless required by applicable law or agreed to in writing, software 1157b86d47b66322693a070185fadfb43cb9c12eabIan Rogers * distributed under the License is distributed on an "AS IS" BASIS, 1257b86d47b66322693a070185fadfb43cb9c12eabIan Rogers * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1357b86d47b66322693a070185fadfb43cb9c12eabIan Rogers * See the License for the specific language governing permissions and 1457b86d47b66322693a070185fadfb43cb9c12eabIan Rogers * limitations under the License. 1557b86d47b66322693a070185fadfb43cb9c12eabIan Rogers */ 1657b86d47b66322693a070185fadfb43cb9c12eabIan Rogers 1757b86d47b66322693a070185fadfb43cb9c12eabIan Rogers#include "callee_save_frame.h" 18d9c4fc94fa618617f94e1de9af5f034549100753Ian Rogers#include "common_throws.h" 1905f3057d6a4d23d712092ccd36a531590bff323bIan Rogers#include "mirror/object-inl.h" 2057b86d47b66322693a070185fadfb43cb9c12eabIan Rogers 2157b86d47b66322693a070185fadfb43cb9c12eabIan Rogersnamespace art { 2257b86d47b66322693a070185fadfb43cb9c12eabIan Rogers 231d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogersextern "C" int artLockObjectFromCode(mirror::Object* obj, Thread* self) 242d096c94fbd3fd2470b8ac1a0da6f577b3f69f42Mathieu Chartier NO_THREAD_SAFETY_ANALYSIS 252d096c94fbd3fd2470b8ac1a0da6f577b3f69f42Mathieu Chartier REQUIRES(!Roles::uninterruptible_) 262d096c94fbd3fd2470b8ac1a0da6f577b3f69f42Mathieu Chartier SHARED_REQUIRES(Locks::mutator_lock_) /* EXCLUSIVE_LOCK_FUNCTION(Monitor::monitor_lock_) */ { 271d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers ScopedQuickEntrypointChecks sqec(self); 281d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers if (UNLIKELY(obj == nullptr)) { 290aa50ce2fb75bfc2e815a0c33adf9b049561923bNicolas Geoffray ThrowNullPointerException("Null reference used for synchronization (monitor-enter)"); 30d9c4fc94fa618617f94e1de9af5f034549100753Ian Rogers return -1; // Failure. 31d9c4fc94fa618617f94e1de9af5f034549100753Ian Rogers } else { 32590fee9e8972f872301c2d16a575d579ee564beeMathieu Chartier if (kIsDebugBuild) { 33e7e8a5fea2d852cccc840fa046151a16627f26cdMathieu Chartier obj = obj->MonitorEnter(self); // May block 34e7e8a5fea2d852cccc840fa046151a16627f26cdMathieu Chartier CHECK(self->HoldsLock(obj)); 35590fee9e8972f872301c2d16a575d579ee564beeMathieu Chartier CHECK(!self->IsExceptionPending()); 36590fee9e8972f872301c2d16a575d579ee564beeMathieu Chartier } else { 37590fee9e8972f872301c2d16a575d579ee564beeMathieu Chartier obj->MonitorEnter(self); // May block 38590fee9e8972f872301c2d16a575d579ee564beeMathieu Chartier } 39d9c4fc94fa618617f94e1de9af5f034549100753Ian Rogers return 0; // Success. 40d9c4fc94fa618617f94e1de9af5f034549100753Ian Rogers // Only possible exception is NPE and is handled before entry 41d9c4fc94fa618617f94e1de9af5f034549100753Ian Rogers } 4257b86d47b66322693a070185fadfb43cb9c12eabIan Rogers} 4357b86d47b66322693a070185fadfb43cb9c12eabIan Rogers 441d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogersextern "C" int artUnlockObjectFromCode(mirror::Object* obj, Thread* self) 452d096c94fbd3fd2470b8ac1a0da6f577b3f69f42Mathieu Chartier NO_THREAD_SAFETY_ANALYSIS 462d096c94fbd3fd2470b8ac1a0da6f577b3f69f42Mathieu Chartier REQUIRES(!Roles::uninterruptible_) 472d096c94fbd3fd2470b8ac1a0da6f577b3f69f42Mathieu Chartier SHARED_REQUIRES(Locks::mutator_lock_) /* UNLOCK_FUNCTION(Monitor::monitor_lock_) */ { 481d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers ScopedQuickEntrypointChecks sqec(self); 491d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers if (UNLIKELY(obj == nullptr)) { 500aa50ce2fb75bfc2e815a0c33adf9b049561923bNicolas Geoffray ThrowNullPointerException("Null reference used for synchronization (monitor-exit)"); 51d9c4fc94fa618617f94e1de9af5f034549100753Ian Rogers return -1; // Failure. 52d9c4fc94fa618617f94e1de9af5f034549100753Ian Rogers } else { 53d9c4fc94fa618617f94e1de9af5f034549100753Ian Rogers // MonitorExit may throw exception. 54d9c4fc94fa618617f94e1de9af5f034549100753Ian Rogers return obj->MonitorExit(self) ? 0 /* Success */ : -1 /* Failure */; 55d9c4fc94fa618617f94e1de9af5f034549100753Ian Rogers } 5657b86d47b66322693a070185fadfb43cb9c12eabIan Rogers} 5757b86d47b66322693a070185fadfb43cb9c12eabIan Rogers 5857b86d47b66322693a070185fadfb43cb9c12eabIan Rogers} // namespace art 59