diff options
Diffstat (limited to 'runtime')
-rw-r--r-- | runtime/base/mutex.h | 2 | ||||
-rw-r--r-- | runtime/trace.cc | 20 | ||||
-rw-r--r-- | runtime/trace.h | 25 |
3 files changed, 28 insertions, 19 deletions
diff --git a/runtime/base/mutex.h b/runtime/base/mutex.h index aa91ca1..678d55b 100644 --- a/runtime/base/mutex.h +++ b/runtime/base/mutex.h @@ -80,6 +80,8 @@ enum LockLevel { kMarkSweepMarkStackLock, kInternTableLock, kOatFileSecondaryLookupLock, + kTracingUniqueMethodsLock, + kTracingStreamingLock, kDefaultMutexLevel, kMarkSweepLargeObjectLock, kPinTableLock, diff --git a/runtime/trace.cc b/runtime/trace.cc index 5a43b56..487baed 100644 --- a/runtime/trace.cc +++ b/runtime/trace.cc @@ -427,7 +427,7 @@ void Trace::StopTracing(bool finish_tracing, bool flush_file) { // Do not try to erase, so flush and close explicitly. if (flush_file) { if (the_trace->trace_file_->Flush() != 0) { - PLOG(ERROR) << "Could not flush trace file."; + PLOG(WARNING) << "Could not flush trace file."; } } else { the_trace->trace_file_->MarkUnchecked(); // Do not trigger guard. @@ -581,7 +581,7 @@ Trace::Trace(File* trace_file, const char* trace_name, size_t buffer_size, int f buffer_size_(std::max(kMinBufSize, buffer_size)), start_time_(MicroTime()), clock_overhead_ns_(GetClockOverheadNanoSeconds()), cur_offset_(0), overflow_(false), interval_us_(0), streaming_lock_(nullptr), - unique_methods_lock_(new Mutex("unique methods lock")) { + unique_methods_lock_(new Mutex("unique methods lock", kTracingUniqueMethodsLock)) { uint16_t trace_version = GetTraceVersion(clock_source_); if (output_mode == TraceOutputMode::kStreaming) { trace_version |= 0xF0U; @@ -603,13 +603,14 @@ Trace::Trace(File* trace_file, const char* trace_name, size_t buffer_size, int f if (output_mode == TraceOutputMode::kStreaming) { streaming_file_name_ = trace_name; - streaming_lock_ = new Mutex("tracing lock"); + streaming_lock_ = new Mutex("tracing lock", LockLevel::kTracingStreamingLock); seen_threads_.reset(new ThreadIDBitSet()); } } Trace::~Trace() { delete streaming_lock_; + delete unique_methods_lock_; } static uint64_t ReadBytes(uint8_t* buf, size_t bytes) { @@ -634,13 +635,15 @@ void Trace::DumpBuf(uint8_t* buf, size_t buf_size, TraceClockSource clock_source } static void GetVisitedMethodsFromBitSets( - const std::map<mirror::DexCache*, DexIndexBitSet*>& seen_methods, + const std::map<const DexFile*, DexIndexBitSet*>& seen_methods, std::set<ArtMethod*>* visited_methods) SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) { + ClassLinker* class_linker = Runtime::Current()->GetClassLinker(); for (auto& e : seen_methods) { DexIndexBitSet* bit_set = e.second; + mirror::DexCache* dex_cache = class_linker->FindDexCache(*e.first); for (uint32_t i = 0; i < bit_set->size(); ++i) { if ((*bit_set)[i]) { - visited_methods->insert(e.first->GetResolvedMethod(i, sizeof(void*))); + visited_methods->insert(dex_cache->GetResolvedMethod(i, sizeof(void*))); } } } @@ -819,15 +822,16 @@ void Trace::ReadClocks(Thread* thread, uint32_t* thread_clock_diff, uint32_t* wa bool Trace::RegisterMethod(ArtMethod* method) { mirror::DexCache* dex_cache = method->GetDexCache(); + const DexFile* dex_file = dex_cache->GetDexFile(); auto* resolved_method = dex_cache->GetResolvedMethod(method->GetDexMethodIndex(), sizeof(void*)); if (resolved_method != method) { DCHECK(resolved_method == nullptr); dex_cache->SetResolvedMethod(method->GetDexMethodIndex(), method, sizeof(void*)); } - if (seen_methods_.find(dex_cache) == seen_methods_.end()) { - seen_methods_.insert(std::make_pair(dex_cache, new DexIndexBitSet())); + if (seen_methods_.find(dex_file) == seen_methods_.end()) { + seen_methods_.insert(std::make_pair(dex_file, new DexIndexBitSet())); } - DexIndexBitSet* bit_set = seen_methods_.find(dex_cache)->second; + DexIndexBitSet* bit_set = seen_methods_.find(dex_file)->second; if (!(*bit_set)[method->GetDexMethodIndex()]) { bit_set->set(method->GetDexMethodIndex()); return true; diff --git a/runtime/trace.h b/runtime/trace.h index 7bc495a..69e6acc 100644 --- a/runtime/trace.h +++ b/runtime/trace.h @@ -35,12 +35,9 @@ namespace art { -namespace mirror { - class DexCache; -} // namespace mirror - class ArtField; class ArtMethod; +class DexFile; class Thread; using DexIndexBitSet = std::bitset<65536>; @@ -126,15 +123,18 @@ class Trace FINAL : public instrumentation::InstrumentationListener { // Stop tracing. This will finish the trace and write it to file/send it via DDMS. static void Stop() - LOCKS_EXCLUDED(Locks::mutator_lock_, - Locks::thread_list_lock_, - Locks::trace_lock_); + LOCKS_EXCLUDED(Locks::mutator_lock_, + Locks::thread_list_lock_, + Locks::trace_lock_); // Abort tracing. This will just stop tracing and *not* write/send the collected data. static void Abort() LOCKS_EXCLUDED(Locks::mutator_lock_, Locks::thread_list_lock_, Locks::trace_lock_); - static void Shutdown() LOCKS_EXCLUDED(Locks::trace_lock_); + static void Shutdown() + LOCKS_EXCLUDED(Locks::mutator_lock_, + Locks::thread_list_lock_, + Locks::trace_lock_); static TracingMode GetMethodTracingMode() LOCKS_EXCLUDED(Locks::trace_lock_); bool UseWallClock(); @@ -188,7 +188,10 @@ class Trace FINAL : public instrumentation::InstrumentationListener { // The sampling interval in microseconds is passed as an argument. static void* RunSamplingThread(void* arg) LOCKS_EXCLUDED(Locks::trace_lock_); - static void StopTracing(bool finish_tracing, bool flush_file); + static void StopTracing(bool finish_tracing, bool flush_file) + LOCKS_EXCLUDED(Locks::mutator_lock_, + Locks::thread_list_lock_, + Locks::trace_lock_); void FinishTracing() SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); void ReadClocks(Thread* thread, uint32_t* thread_clock_diff, uint32_t* wall_clock_diff); @@ -279,12 +282,12 @@ class Trace FINAL : public instrumentation::InstrumentationListener { // Streaming mode data. std::string streaming_file_name_; Mutex* streaming_lock_; - std::map<mirror::DexCache*, DexIndexBitSet*> seen_methods_; + std::map<const DexFile*, DexIndexBitSet*> seen_methods_; std::unique_ptr<ThreadIDBitSet> seen_threads_; // Bijective map from ArtMethod* to index. // Map from ArtMethod* to index in unique_methods_; - Mutex* unique_methods_lock_ DEFAULT_MUTEX_ACQUIRED_AFTER; + Mutex* unique_methods_lock_ ACQUIRED_AFTER(streaming_lock_); std::unordered_map<ArtMethod*, uint32_t> art_method_id_map_ GUARDED_BY(unique_methods_lock_); std::vector<ArtMethod*> unique_methods_ GUARDED_BY(unique_methods_lock_); |