Fix broken runtime SetStatsEnabled logic
Previously, Runtime::SetStatsEnabled wouldn't take stats_enabled_
into account when deciding whether or not to increment / decrement
teh stats enabled counter. This resulted in counter underflows and
other errors which caused some CTS tests to fail.
Also added some locking to prevent race conditions.
Bug: 17360878
(cherry picked from commit a98ffd745bbecb2e84a492194950c0b94966546b)
Change-Id: I21d241a58d35bd6a607aa2305c6da81720bd0886
diff --git a/runtime/runtime.cc b/runtime/runtime.cc
index 3432aa8..49f8c63 100644
--- a/runtime/runtime.cc
+++ b/runtime/runtime.cc
@@ -1007,14 +1007,18 @@
}
}
-void Runtime::SetStatsEnabled(bool new_state, bool suspended) {
+void Runtime::SetStatsEnabled(bool new_state) {
+ Thread* self = Thread::Current();
+ MutexLock mu(self, *Locks::instrument_entrypoints_lock_);
if (new_state == true) {
GetStats()->Clear(~0);
// TODO: wouldn't it make more sense to clear _all_ threads' stats?
- Thread::Current()->GetStats()->Clear(~0);
- GetInstrumentation()->InstrumentQuickAllocEntryPoints(suspended);
- } else {
- GetInstrumentation()->UninstrumentQuickAllocEntryPoints(suspended);
+ self->GetStats()->Clear(~0);
+ if (stats_enabled_ != new_state) {
+ GetInstrumentation()->InstrumentQuickAllocEntryPointsLocked();
+ }
+ } else if (stats_enabled_ != new_state) {
+ GetInstrumentation()->UninstrumentQuickAllocEntryPointsLocked();
}
stats_enabled_ = new_state;
}