122d5e735f403c57525fe868304c7123f0ce66399Ian Rogers/* 222d5e735f403c57525fe868304c7123f0ce66399Ian Rogers * Copyright (C) 2011 The Android Open Source Project 322d5e735f403c57525fe868304c7123f0ce66399Ian Rogers * 422d5e735f403c57525fe868304c7123f0ce66399Ian Rogers * Licensed under the Apache License, Version 2.0 (the "License"); 522d5e735f403c57525fe868304c7123f0ce66399Ian Rogers * you may not use this file except in compliance with the License. 622d5e735f403c57525fe868304c7123f0ce66399Ian Rogers * You may obtain a copy of the License at 722d5e735f403c57525fe868304c7123f0ce66399Ian Rogers * 822d5e735f403c57525fe868304c7123f0ce66399Ian Rogers * http://www.apache.org/licenses/LICENSE-2.0 922d5e735f403c57525fe868304c7123f0ce66399Ian Rogers * 1022d5e735f403c57525fe868304c7123f0ce66399Ian Rogers * Unless required by applicable law or agreed to in writing, software 1122d5e735f403c57525fe868304c7123f0ce66399Ian Rogers * distributed under the License is distributed on an "AS IS" BASIS, 1222d5e735f403c57525fe868304c7123f0ce66399Ian Rogers * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1322d5e735f403c57525fe868304c7123f0ce66399Ian Rogers * See the License for the specific language governing permissions and 1422d5e735f403c57525fe868304c7123f0ce66399Ian Rogers * limitations under the License. 1522d5e735f403c57525fe868304c7123f0ce66399Ian Rogers */ 1622d5e735f403c57525fe868304c7123f0ce66399Ian Rogers 1722d5e735f403c57525fe868304c7123f0ce66399Ian Rogers#include "object_lock.h" 1822d5e735f403c57525fe868304c7123f0ce66399Ian Rogers 1922d5e735f403c57525fe868304c7123f0ce66399Ian Rogers#include "mirror/object-inl.h" 2022d5e735f403c57525fe868304c7123f0ce66399Ian Rogers#include "monitor.h" 2122d5e735f403c57525fe868304c7123f0ce66399Ian Rogers 2222d5e735f403c57525fe868304c7123f0ce66399Ian Rogersnamespace art { 2322d5e735f403c57525fe868304c7123f0ce66399Ian Rogers 2422d5e735f403c57525fe868304c7123f0ce66399Ian Rogerstemplate <typename T> 255a4b8a236030460651a3136397d23ca6744e7eb7Andreas GampeObjectLock<T>::ObjectLock(Thread* self, Handle<T> object) : self_(self), obj_(object) { 2622d5e735f403c57525fe868304c7123f0ce66399Ian Rogers CHECK(object.Get() != nullptr); 2722d5e735f403c57525fe868304c7123f0ce66399Ian Rogers obj_->MonitorEnter(self_); 2822d5e735f403c57525fe868304c7123f0ce66399Ian Rogers} 2922d5e735f403c57525fe868304c7123f0ce66399Ian Rogers 3022d5e735f403c57525fe868304c7123f0ce66399Ian Rogerstemplate <typename T> 3122d5e735f403c57525fe868304c7123f0ce66399Ian RogersObjectLock<T>::~ObjectLock() { 3222d5e735f403c57525fe868304c7123f0ce66399Ian Rogers obj_->MonitorExit(self_); 3322d5e735f403c57525fe868304c7123f0ce66399Ian Rogers} 3422d5e735f403c57525fe868304c7123f0ce66399Ian Rogers 3522d5e735f403c57525fe868304c7123f0ce66399Ian Rogerstemplate <typename T> 3622d5e735f403c57525fe868304c7123f0ce66399Ian Rogersvoid ObjectLock<T>::WaitIgnoringInterrupts() { 3722d5e735f403c57525fe868304c7123f0ce66399Ian Rogers Monitor::Wait(self_, obj_.Get(), 0, 0, false, kWaiting); 3822d5e735f403c57525fe868304c7123f0ce66399Ian Rogers} 3922d5e735f403c57525fe868304c7123f0ce66399Ian Rogers 4022d5e735f403c57525fe868304c7123f0ce66399Ian Rogerstemplate <typename T> 4122d5e735f403c57525fe868304c7123f0ce66399Ian Rogersvoid ObjectLock<T>::Notify() { 4222d5e735f403c57525fe868304c7123f0ce66399Ian Rogers obj_->Notify(self_); 4322d5e735f403c57525fe868304c7123f0ce66399Ian Rogers} 4422d5e735f403c57525fe868304c7123f0ce66399Ian Rogers 4522d5e735f403c57525fe868304c7123f0ce66399Ian Rogerstemplate <typename T> 4622d5e735f403c57525fe868304c7123f0ce66399Ian Rogersvoid ObjectLock<T>::NotifyAll() { 4722d5e735f403c57525fe868304c7123f0ce66399Ian Rogers obj_->NotifyAll(self_); 4822d5e735f403c57525fe868304c7123f0ce66399Ian Rogers} 4922d5e735f403c57525fe868304c7123f0ce66399Ian Rogers 5023da026ec7a7fae22833ed2f61a80d9f9bf7e732Mathieu Chartiertemplate <typename T> 5123da026ec7a7fae22833ed2f61a80d9f9bf7e732Mathieu ChartierObjectTryLock<T>::ObjectTryLock(Thread* self, Handle<T> object) : self_(self), obj_(object) { 5223da026ec7a7fae22833ed2f61a80d9f9bf7e732Mathieu Chartier CHECK(object.Get() != nullptr); 5323da026ec7a7fae22833ed2f61a80d9f9bf7e732Mathieu Chartier acquired_ = obj_->MonitorTryEnter(self_) != nullptr; 5423da026ec7a7fae22833ed2f61a80d9f9bf7e732Mathieu Chartier} 5523da026ec7a7fae22833ed2f61a80d9f9bf7e732Mathieu Chartier 5623da026ec7a7fae22833ed2f61a80d9f9bf7e732Mathieu Chartiertemplate <typename T> 5723da026ec7a7fae22833ed2f61a80d9f9bf7e732Mathieu ChartierObjectTryLock<T>::~ObjectTryLock() { 5823da026ec7a7fae22833ed2f61a80d9f9bf7e732Mathieu Chartier if (acquired_) { 5923da026ec7a7fae22833ed2f61a80d9f9bf7e732Mathieu Chartier obj_->MonitorExit(self_); 6023da026ec7a7fae22833ed2f61a80d9f9bf7e732Mathieu Chartier } 6123da026ec7a7fae22833ed2f61a80d9f9bf7e732Mathieu Chartier} 6223da026ec7a7fae22833ed2f61a80d9f9bf7e732Mathieu Chartier 6322d5e735f403c57525fe868304c7123f0ce66399Ian Rogerstemplate class ObjectLock<mirror::Class>; 6422d5e735f403c57525fe868304c7123f0ce66399Ian Rogerstemplate class ObjectLock<mirror::Object>; 6523da026ec7a7fae22833ed2f61a80d9f9bf7e732Mathieu Chartiertemplate class ObjectTryLock<mirror::Class>; 6623da026ec7a7fae22833ed2f61a80d9f9bf7e732Mathieu Chartiertemplate class ObjectTryLock<mirror::Object>; 6722d5e735f403c57525fe868304c7123f0ce66399Ian Rogers 6822d5e735f403c57525fe868304c7123f0ce66399Ian Rogers} // namespace art 69