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