summaryrefslogtreecommitdiffstats
path: root/runtime/thread_list.cc
diff options
context:
space:
mode:
authorIan Rogers <irogers@google.com>2014-04-02 08:34:36 -0700
committerIan Rogers <irogers@google.com>2014-04-02 08:36:46 -0700
commit2966e13d504a72d55c62bf864e183ec80703c699 (patch)
treece13371288e4a08e8b627eeafd18a5b9746ecec4 /runtime/thread_list.cc
parent161f71ab4449047157ad3d967a3ed4f7c6e17249 (diff)
downloadandroid_art-2966e13d504a72d55c62bf864e183ec80703c699.tar.gz
android_art-2966e13d504a72d55c62bf864e183ec80703c699.tar.bz2
android_art-2966e13d504a72d55c62bf864e183ec80703c699.zip
Avoid debug check violation in thread registration.
Bug: 13757855 Change-Id: Ied83a7fc43e2b9a89a8b99aa4f74069ef8a369b1
Diffstat (limited to 'runtime/thread_list.cc')
-rw-r--r--runtime/thread_list.cc13
1 files changed, 6 insertions, 7 deletions
diff --git a/runtime/thread_list.cc b/runtime/thread_list.cc
index 09337802bf..7de9433b24 100644
--- a/runtime/thread_list.cc
+++ b/runtime/thread_list.cc
@@ -750,14 +750,13 @@ void ThreadList::Register(Thread* self) {
MutexLock mu(self, *Locks::thread_list_lock_);
MutexLock mu2(self, *Locks::thread_suspend_count_lock_);
CHECK_GE(suspend_all_count_, debug_suspend_all_count_);
- if (debug_suspend_all_count_ > 0) {
- self->ModifySuspendCount(self, debug_suspend_all_count_, true);
+ // Modify suspend count in increments of 1 to maintain invariants in ModifySuspendCount. While
+ // this isn't particularly efficient the suspend counts are most commonly 0 or 1.
+ for (int delta = debug_suspend_all_count_; delta > 0; delta--) {
+ self->ModifySuspendCount(self, +1, true);
}
- if (suspend_all_count_ > 0) {
- int delta = suspend_all_count_ - debug_suspend_all_count_;
- if (delta > 0) {
- self->ModifySuspendCount(self, delta, false);
- }
+ for (int delta = suspend_all_count_ - debug_suspend_all_count_; delta > 0; delta--) {
+ self->ModifySuspendCount(self, +1, false);
}
CHECK(!Contains(self));
list_.push_back(self);