summaryrefslogtreecommitdiffstats
path: root/runtime/instrumentation.h
diff options
context:
space:
mode:
authorMathieu Chartier <mathieuc@google.com>2014-09-25 17:03:12 -0700
committerMathieu Chartier <mathieuc@google.com>2014-09-26 16:04:56 -0700
commit9ef78b59da51080882e47505896b420977fd79ae (patch)
tree6c568756e4e16e68d5d3346261009350969d5b77 /runtime/instrumentation.h
parent95f03e6a4737f90685fab86e98709f1c4393d5ef (diff)
downloadart-9ef78b59da51080882e47505896b420977fd79ae.zip
art-9ef78b59da51080882e47505896b420977fd79ae.tar.gz
art-9ef78b59da51080882e47505896b420977fd79ae.tar.bz2
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
Diffstat (limited to 'runtime/instrumentation.h')
-rw-r--r--runtime/instrumentation.h14
1 files changed, 9 insertions, 5 deletions
diff --git a/runtime/instrumentation.h b/runtime/instrumentation.h
index 3c1c756..3017bf6 100644
--- a/runtime/instrumentation.h
+++ b/runtime/instrumentation.h
@@ -182,9 +182,13 @@ class Instrumentation {
return interpreter_handler_table_;
}
- void InstrumentQuickAllocEntryPoints(bool suspended)
+ void InstrumentQuickAllocEntryPoints() LOCKS_EXCLUDED(Locks::instrument_entrypoints_lock_);
+ void UninstrumentQuickAllocEntryPoints() LOCKS_EXCLUDED(Locks::instrument_entrypoints_lock_);
+ void InstrumentQuickAllocEntryPointsLocked()
+ EXCLUSIVE_LOCKS_REQUIRED(Locks::instrument_entrypoints_lock_)
LOCKS_EXCLUDED(Locks::thread_list_lock_, Locks::runtime_shutdown_lock_);
- void UninstrumentQuickAllocEntryPoints(bool suspended)
+ void UninstrumentQuickAllocEntryPointsLocked()
+ EXCLUSIVE_LOCKS_REQUIRED(Locks::instrument_entrypoints_lock_)
LOCKS_EXCLUDED(Locks::thread_list_lock_, Locks::runtime_shutdown_lock_);
void ResetQuickAllocEntryPoints() EXCLUSIVE_LOCKS_REQUIRED(Locks::runtime_shutdown_lock_);
@@ -350,7 +354,7 @@ class Instrumentation {
// No thread safety analysis to get around SetQuickAllocEntryPointsInstrumented requiring
// exclusive access to mutator lock which you can't get if the runtime isn't started.
- void SetEntrypointsInstrumented(bool instrumented, bool suspended) NO_THREAD_SAFETY_ANALYSIS;
+ void SetEntrypointsInstrumented(bool instrumented) NO_THREAD_SAFETY_ANALYSIS;
void MethodEnterEventImpl(Thread* thread, mirror::Object* this_object,
mirror::ArtMethod* method, uint32_t dex_pc) const
@@ -455,8 +459,8 @@ class Instrumentation {
InterpreterHandlerTable interpreter_handler_table_ GUARDED_BY(Locks::mutator_lock_);
// Greater than 0 if quick alloc entry points instrumented.
- // TODO: The access and changes to this is racy and should be guarded by a lock.
- AtomicInteger quick_alloc_entry_points_instrumentation_counter_;
+ size_t quick_alloc_entry_points_instrumentation_counter_
+ GUARDED_BY(Locks::instrument_entrypoints_lock_);
DISALLOW_COPY_AND_ASSIGN(Instrumentation);
};