diff options
author | Mathieu Chartier <mathieuc@google.com> | 2014-05-16 09:59:29 -0700 |
---|---|---|
committer | Mathieu Chartier <mathieuc@google.com> | 2014-05-16 10:36:37 -0700 |
commit | db2633ce0358c704f97130a94b582602cb01d14a (patch) | |
tree | ab941b728fe4343eb9872abc85755640bf059800 /runtime | |
parent | f59c6dda4928cfb05d32a56fd161e3f86a9ca560 (diff) | |
download | android_art-db2633ce0358c704f97130a94b582602cb01d14a.tar.gz android_art-db2633ce0358c704f97130a94b582602cb01d14a.tar.bz2 android_art-db2633ce0358c704f97130a94b582602cb01d14a.zip |
Change ObjectLock to take Handle instead of Handle pointer.
Change-Id: I9abdcdc5c9c9174634336b9250ab24c6aee434ec
Diffstat (limited to 'runtime')
-rw-r--r-- | runtime/class_linker.cc | 23 | ||||
-rw-r--r-- | runtime/handle_scope.h | 7 | ||||
-rw-r--r-- | runtime/object_utils.h | 18 | ||||
-rw-r--r-- | runtime/thread.cc | 2 |
4 files changed, 23 insertions, 27 deletions
diff --git a/runtime/class_linker.cc b/runtime/class_linker.cc index c7f3a20ee3..6b98da9747 100644 --- a/runtime/class_linker.cc +++ b/runtime/class_linker.cc @@ -1325,8 +1325,8 @@ static mirror::Class* EnsureResolved(Thread* self, mirror::Class* klass) // Wait for the class if it has not already been linked. if (!klass->IsResolved() && !klass->IsErroneous()) { StackHandleScope<1> hs(self); - Handle<mirror::Class> h_class(hs.NewHandle(klass)); - ObjectLock<mirror::Class> lock(self, &h_class); + HandleWrapper<mirror::Class> h_class(hs.NewHandleWrapper(&klass)); + ObjectLock<mirror::Class> lock(self, h_class); // Check for circular dependencies between classes. if (!h_class->IsResolved() && h_class->GetClinitThreadId() == self->GetTid()) { ThrowClassCircularityError(h_class.Get()); @@ -1337,7 +1337,6 @@ static mirror::Class* EnsureResolved(Thread* self, mirror::Class* klass) while (!h_class->IsResolved() && !h_class->IsErroneous()) { lock.WaitIgnoringInterrupts(); } - klass = h_class.Get(); } if (klass->IsErroneous()) { ThrowEarlierClassFailure(klass); @@ -1471,7 +1470,7 @@ mirror::Class* ClassLinker::DefineClass(const char* descriptor, klass->SetStatus(mirror::Class::kStatusError, self); return NULL; } - ObjectLock<mirror::Class> lock(self, &klass); + ObjectLock<mirror::Class> lock(self, klass); klass->SetClinitThreadId(self->GetTid()); // Add the newly loaded class to the loaded classes table. mirror::Class* existing = InsertClass(descriptor, klass.Get(), Hash(descriptor)); @@ -2182,7 +2181,7 @@ mirror::Class* ClassLinker::InitializePrimitiveClass(mirror::Class* primitive_cl Thread* self = Thread::Current(); StackHandleScope<1> hs(self); Handle<mirror::Class> h_class(hs.NewHandle(primitive_class)); - ObjectLock<mirror::Class> lock(self, &h_class); + ObjectLock<mirror::Class> lock(self, h_class); primitive_class->SetAccessFlags(kAccPublic | kAccFinal | kAccAbstract); primitive_class->SetPrimitiveType(type); primitive_class->SetStatus(mirror::Class::kStatusInitialized, self); @@ -2279,7 +2278,7 @@ mirror::Class* ClassLinker::CreateArrayClass(Thread* self, const char* descripto } new_class->SetComponentType(component_type.Get()); } - ObjectLock<mirror::Class> lock(self, &new_class); // Must hold lock on object when initializing. + ObjectLock<mirror::Class> lock(self, new_class); // Must hold lock on object when initializing. DCHECK(new_class->GetComponentType() != NULL); mirror::Class* java_lang_Object = GetClassRoot(kJavaLangObject); new_class->SetSuperClass(java_lang_Object); @@ -2554,7 +2553,7 @@ void ClassLinker::LookupClasses(const char* descriptor, std::vector<mirror::Clas void ClassLinker::VerifyClass(const Handle<mirror::Class>& klass) { // TODO: assert that the monitor on the Class is held Thread* self = Thread::Current(); - ObjectLock<mirror::Class> lock(self, &klass); + ObjectLock<mirror::Class> lock(self, klass); // Don't attempt to re-verify if already sufficiently verified. if (klass->IsVerified() || @@ -2589,7 +2588,7 @@ void ClassLinker::VerifyClass(const Handle<mirror::Class>& klass) { Handle<mirror::Class> super(hs.NewHandle(klass->GetSuperClass())); if (super.Get() != NULL) { // Acquire lock to prevent races on verifying the super class. - ObjectLock<mirror::Class> lock(self, &super); + ObjectLock<mirror::Class> lock(self, super); if (!super->IsVerified() && !super->IsErroneous()) { VerifyClass(super); @@ -2903,7 +2902,7 @@ mirror::Class* ClassLinker::CreateProxyClass(ScopedObjectAccess& soa, jstring na self->AssertNoPendingException(); { - ObjectLock<mirror::Class> lock(self, &klass); // Must hold lock on object when resolved. + ObjectLock<mirror::Class> lock(self, klass); // Must hold lock on object when resolved. // Link the fields and virtual methods, creating vtable and iftables Handle<mirror::ObjectArray<mirror::Class> > h_interfaces( hs.NewHandle(soa.Decode<mirror::ObjectArray<mirror::Class>*>(interfaces))); @@ -3121,7 +3120,7 @@ bool ClassLinker::InitializeClass(const Handle<mirror::Class>& klass, bool can_i Thread* self = Thread::Current(); uint64_t t0; { - ObjectLock<mirror::Class> lock(self, &klass); + ObjectLock<mirror::Class> lock(self, klass); // Re-check under the lock in case another thread initialized ahead of us. if (klass->IsInitialized()) { @@ -3198,7 +3197,7 @@ bool ClassLinker::InitializeClass(const Handle<mirror::Class>& klass, bool can_i << " that has unexpected status " << handle_scope_super->GetStatus() << "\nPending exception:\n" << (self->GetException(NULL) != NULL ? self->GetException(NULL)->Dump() : ""); - ObjectLock<mirror::Class> lock(self, &klass); + ObjectLock<mirror::Class> lock(self, klass); // Initialization failed because the super-class is erroneous. klass->SetStatus(mirror::Class::kStatusError, self); return false; @@ -3242,7 +3241,7 @@ bool ClassLinker::InitializeClass(const Handle<mirror::Class>& klass, bool can_i bool success = true; { - ObjectLock<mirror::Class> lock(self, &klass); + ObjectLock<mirror::Class> lock(self, klass); if (self->IsExceptionPending()) { WrapExceptionInInitializer(); diff --git a/runtime/handle_scope.h b/runtime/handle_scope.h index 27c1bdcfd4..f2e059d6bc 100644 --- a/runtime/handle_scope.h +++ b/runtime/handle_scope.h @@ -144,19 +144,18 @@ class HandleScope { // A wrapper which wraps around Object** and restores the pointer in the destructor. // TODO: Add more functionality. template<class T> -class HandleWrapper { +class HandleWrapper : public Handle<T> { public: HandleWrapper(T** obj, const Handle<T>& handle) - : obj_(obj), handle_(handle) { + : Handle<T>(handle), obj_(obj) { } ~HandleWrapper() { - *obj_ = handle_.Get(); + *obj_ = Handle<T>::Get(); } private: T** obj_; - Handle<T> handle_; }; // Scoped handle storage of a fixed size that is usually stack allocated. diff --git a/runtime/object_utils.h b/runtime/object_utils.h index 0dd6ca1134..b1e8c099b7 100644 --- a/runtime/object_utils.h +++ b/runtime/object_utils.h @@ -38,33 +38,31 @@ namespace art { template <typename T> class ObjectLock { public: - explicit ObjectLock(Thread* self, const Handle<T>* object) - SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) + ObjectLock(Thread* self, Handle<T> object) SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) : self_(self), obj_(object) { - CHECK(object != nullptr); - CHECK(object->Get() != nullptr); - obj_->Get()->MonitorEnter(self_); + CHECK(object.Get() != nullptr); + obj_->MonitorEnter(self_); } ~ObjectLock() SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) { - obj_->Get()->MonitorExit(self_); + obj_->MonitorExit(self_); } void WaitIgnoringInterrupts() SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) { - Monitor::Wait(self_, obj_->Get(), 0, 0, false, kWaiting); + Monitor::Wait(self_, obj_.Get(), 0, 0, false, kWaiting); } void Notify() SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) { - obj_->Get()->Notify(self_); + obj_->Notify(self_); } void NotifyAll() SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) { - obj_->Get()->NotifyAll(self_); + obj_->NotifyAll(self_); } private: Thread* const self_; - const Handle<T>* const obj_; + Handle<T> const obj_; DISALLOW_COPY_AND_ASSIGN(ObjectLock); }; diff --git a/runtime/thread.cc b/runtime/thread.cc index d535118485..415cc0ba88 100644 --- a/runtime/thread.cc +++ b/runtime/thread.cc @@ -1105,7 +1105,7 @@ void Thread::Destroy() { if (lock != nullptr) { StackHandleScope<1> hs(self); Handle<mirror::Object> h_obj(hs.NewHandle(lock)); - ObjectLock<mirror::Object> locker(self, &h_obj); + ObjectLock<mirror::Object> locker(self, h_obj); locker.NotifyAll(); } } |