diff options
author | Hiroshi Yamauchi <yamauchi@google.com> | 2014-05-22 17:34:44 +0000 |
---|---|---|
committer | Gerrit Code Review <noreply-gerritcodereview@google.com> | 2014-05-22 17:34:45 +0000 |
commit | 225353e2ff7072d4e4aa9d2cd9cdbfa83670e323 (patch) | |
tree | 41b4ab344e0d5eef729be167d97857112e48670e /runtime/monitor.cc | |
parent | 5da6e2b88258733dd3856543af27ca73b395ef60 (diff) | |
parent | 4cba0d979a11f955e6ec3c0f1bf61478af7aa810 (diff) | |
download | art-225353e2ff7072d4e4aa9d2cd9cdbfa83670e323.zip art-225353e2ff7072d4e4aa9d2cd9cdbfa83670e323.tar.gz art-225353e2ff7072d4e4aa9d2cd9cdbfa83670e323.tar.bz2 |
Merge "Add a read barrier for weak roots in monitors."
Diffstat (limited to 'runtime/monitor.cc')
-rw-r--r-- | runtime/monitor.cc | 15 |
1 files changed, 8 insertions, 7 deletions
diff --git a/runtime/monitor.cc b/runtime/monitor.cc index f783edb..7d297cb 100644 --- a/runtime/monitor.cc +++ b/runtime/monitor.cc @@ -111,7 +111,7 @@ bool Monitor::Install(Thread* self) { MutexLock mu(self, monitor_lock_); // Uncontended mutex acquisition as monitor isn't yet public. CHECK(owner_ == nullptr || owner_ == self || owner_->IsSuspended()); // Propagate the lock state. - LockWord lw(obj_->GetLockWord(false)); + LockWord lw(GetObject()->GetLockWord(false)); switch (lw.GetState()) { case LockWord::kThinLocked: { CHECK_EQ(owner_->GetThreadId(), lw.ThinLockOwner()); @@ -137,7 +137,7 @@ bool Monitor::Install(Thread* self) { } LockWord fat(this); // Publish the updated lock word, which may race with other threads. - bool success = obj_->CasLockWord(lw, fat); + bool success = GetObject()->CasLockWord(lw, fat); // Lock profiling. if (success && owner_ != nullptr && lock_profiling_threshold_ != 0) { locking_method_ = owner_->GetCurrentMethod(&locking_dex_pc_); @@ -228,7 +228,7 @@ void Monitor::Lock(Thread* self) { monitor_lock_.Unlock(self); // Let go of locks in order. { ScopedThreadStateChange tsc(self, kBlocked); // Change to blocked and give up mutator_lock_. - self->SetMonitorEnterObject(obj_); + self->SetMonitorEnterObject(GetObject()); MutexLock mu2(self, monitor_lock_); // Reacquire monitor_lock_ without mutator_lock_ for Wait. if (owner_ != NULL) { // Did the owner_ give the lock up? monitor_contenders_.Wait(self); // Still contended so wait. @@ -363,7 +363,7 @@ bool Monitor::Unlock(Thread* self) { // We don't own this, so we're not allowed to unlock it. // The JNI spec says that we should throw IllegalMonitorStateException // in this case. - FailedUnlock(obj_, self, owner, this); + FailedUnlock(GetObject(), self, owner, this); return false; } return true; @@ -895,7 +895,7 @@ void Monitor::DescribeWait(std::ostream& os, const Thread* thread) { MutexLock mu(self, *thread->GetWaitMutex()); Monitor* monitor = thread->GetWaitMonitor(); if (monitor != nullptr) { - pretty_object = monitor->obj_; + pretty_object = monitor->GetObject(); } } else if (state == kBlocked) { wait_message = " - waiting to lock "; @@ -1101,12 +1101,13 @@ void MonitorList::SweepMonitorList(IsMarkedCallback* callback, void* arg) { MutexLock mu(Thread::Current(), monitor_list_lock_); for (auto it = list_.begin(); it != list_.end(); ) { Monitor* m = *it; - mirror::Object* obj = m->GetObject(); + // Disable the read barrier in GetObject() as this is called by GC. + mirror::Object* obj = m->GetObject<kWithoutReadBarrier>(); // The object of a monitor can be null if we have deflated it. mirror::Object* new_obj = obj != nullptr ? callback(obj, arg) : nullptr; if (new_obj == nullptr) { VLOG(monitor) << "freeing monitor " << m << " belonging to unmarked object " - << m->GetObject(); + << obj; delete m; it = list_.erase(it); } else { |