diff options
| -rw-r--r-- | runtime/base/mutex.cc | 8 | ||||
| -rw-r--r-- | runtime/base/mutex.h | 6 | ||||
| -rw-r--r-- | runtime/jdwp/jdwp.h | 42 | ||||
| -rw-r--r-- | runtime/jdwp/jdwp_event.cc | 22 | ||||
| -rw-r--r-- | runtime/jdwp/jdwp_main.cc | 3 |
5 files changed, 33 insertions, 48 deletions
diff --git a/runtime/base/mutex.cc b/runtime/base/mutex.cc index 24846e5ceb..b93b293435 100644 --- a/runtime/base/mutex.cc +++ b/runtime/base/mutex.cc @@ -46,7 +46,6 @@ Mutex* Locks::deoptimization_lock_ = nullptr; ReaderWriterMutex* Locks::heap_bitmap_lock_ = nullptr; Mutex* Locks::instrument_entrypoints_lock_ = nullptr; Mutex* Locks::intern_table_lock_ = nullptr; -Mutex* Locks::jdwp_event_list_lock_ = nullptr; Mutex* Locks::jni_function_table_lock_ = nullptr; Mutex* Locks::jni_libraries_lock_ = nullptr; Mutex* Locks::logging_lock_ = nullptr; @@ -999,7 +998,6 @@ void Locks::Init() { DCHECK(verifier_deps_lock_ != nullptr); DCHECK(host_dlopen_handles_lock_ != nullptr); DCHECK(intern_table_lock_ != nullptr); - DCHECK(jdwp_event_list_lock_ != nullptr); DCHECK(jni_function_table_lock_ != nullptr); DCHECK(jni_libraries_lock_ != nullptr); DCHECK(logging_lock_ != nullptr); @@ -1042,10 +1040,6 @@ void Locks::Init() { DCHECK(runtime_shutdown_lock_ == nullptr); runtime_shutdown_lock_ = new Mutex("runtime shutdown lock", current_lock_level); - UPDATE_CURRENT_LOCK_LEVEL(kJdwpEventListLock); - DCHECK(jdwp_event_list_lock_ == nullptr); - jdwp_event_list_lock_ = new Mutex("JDWP event list lock", current_lock_level); - UPDATE_CURRENT_LOCK_LEVEL(kProfilerLock); DCHECK(profiler_lock_ == nullptr); profiler_lock_ = new Mutex("profiler lock", current_lock_level); @@ -1173,8 +1167,6 @@ void Locks::Init() { expected_mutexes_on_weak_ref_access_.push_back(dex_lock_); classlinker_classes_lock_->SetShouldRespondToEmptyCheckpointRequest(true); expected_mutexes_on_weak_ref_access_.push_back(classlinker_classes_lock_); - jdwp_event_list_lock_->SetShouldRespondToEmptyCheckpointRequest(true); - expected_mutexes_on_weak_ref_access_.push_back(jdwp_event_list_lock_); jni_libraries_lock_->SetShouldRespondToEmptyCheckpointRequest(true); expected_mutexes_on_weak_ref_access_.push_back(jni_libraries_lock_); diff --git a/runtime/base/mutex.h b/runtime/base/mutex.h index c59664b9cd..9b6938f9bf 100644 --- a/runtime/base/mutex.h +++ b/runtime/base/mutex.h @@ -630,12 +630,8 @@ class Locks { // Guards shutdown of the runtime. static Mutex* runtime_shutdown_lock_ ACQUIRED_AFTER(heap_bitmap_lock_); - static Mutex* jdwp_event_list_lock_ - ACQUIRED_AFTER(runtime_shutdown_lock_) - ACQUIRED_BEFORE(breakpoint_lock_); - // Guards background profiler global state. - static Mutex* profiler_lock_ ACQUIRED_AFTER(jdwp_event_list_lock_); + static Mutex* profiler_lock_ ACQUIRED_AFTER(runtime_shutdown_lock_); // Guards trace (ie traceview) requests. static Mutex* trace_lock_ ACQUIRED_AFTER(profiler_lock_); diff --git a/runtime/jdwp/jdwp.h b/runtime/jdwp/jdwp.h index af29468062..86af6d44db 100644 --- a/runtime/jdwp/jdwp.h +++ b/runtime/jdwp/jdwp.h @@ -203,8 +203,7 @@ struct JdwpState { */ void PostLocationEvent(const EventLocation* pLoc, mirror::Object* thisPtr, int eventFlags, const JValue* returnValue) - REQUIRES(!Locks::jdwp_event_list_lock_, !jdwp_token_lock_) - REQUIRES_SHARED(Locks::mutator_lock_); + REQUIRES(!event_list_lock_, !jdwp_token_lock_) REQUIRES_SHARED(Locks::mutator_lock_); /* * A field of interest has been accessed or modified. This is used for field access and field @@ -215,8 +214,7 @@ struct JdwpState { */ void PostFieldEvent(const EventLocation* pLoc, ArtField* field, mirror::Object* thisPtr, const JValue* fieldValue, bool is_modification) - REQUIRES(!Locks::jdwp_event_list_lock_, !jdwp_token_lock_) - REQUIRES_SHARED(Locks::mutator_lock_); + REQUIRES(!event_list_lock_, !jdwp_token_lock_) REQUIRES_SHARED(Locks::mutator_lock_); /* * An exception has been thrown. @@ -225,22 +223,19 @@ struct JdwpState { */ void PostException(const EventLocation* pThrowLoc, mirror::Throwable* exception_object, const EventLocation* pCatchLoc, mirror::Object* thisPtr) - REQUIRES(!Locks::jdwp_event_list_lock_, !jdwp_token_lock_) - REQUIRES_SHARED(Locks::mutator_lock_); + REQUIRES(!event_list_lock_, !jdwp_token_lock_) REQUIRES_SHARED(Locks::mutator_lock_); /* * A thread has started or stopped. */ void PostThreadChange(Thread* thread, bool start) - REQUIRES(!Locks::jdwp_event_list_lock_, !jdwp_token_lock_) - REQUIRES_SHARED(Locks::mutator_lock_); + REQUIRES(!event_list_lock_, !jdwp_token_lock_) REQUIRES_SHARED(Locks::mutator_lock_); /* * Class has been prepared. */ void PostClassPrepare(mirror::Class* klass) - REQUIRES(!Locks::jdwp_event_list_lock_, !jdwp_token_lock_) - REQUIRES_SHARED(Locks::mutator_lock_); + REQUIRES(!event_list_lock_, !jdwp_token_lock_) REQUIRES_SHARED(Locks::mutator_lock_); /* * The VM is about to stop. @@ -264,7 +259,7 @@ struct JdwpState { void SendRequest(ExpandBuf* pReq); void ResetState() - REQUIRES(!Locks::jdwp_event_list_lock_) + REQUIRES(!event_list_lock_) REQUIRES_SHARED(Locks::mutator_lock_); /* atomic ops to get next serial number */ @@ -273,7 +268,7 @@ struct JdwpState { void Run() REQUIRES(!Locks::mutator_lock_, !Locks::thread_suspend_count_lock_, !thread_start_lock_, - !attach_lock_, !Locks::jdwp_event_list_lock_); + !attach_lock_, !event_list_lock_); /* * Register an event by adding it to the event list. @@ -282,25 +277,25 @@ struct JdwpState { * may discard its pointer after calling this. */ JdwpError RegisterEvent(JdwpEvent* pEvent) - REQUIRES(!Locks::jdwp_event_list_lock_) + REQUIRES(!event_list_lock_) REQUIRES_SHARED(Locks::mutator_lock_); /* * Unregister an event, given the requestId. */ void UnregisterEventById(uint32_t requestId) - REQUIRES(!Locks::jdwp_event_list_lock_) + REQUIRES(!event_list_lock_) REQUIRES_SHARED(Locks::mutator_lock_); void UnregisterLocationEventsOnClass(ObjPtr<mirror::Class> klass) - REQUIRES(!Locks::jdwp_event_list_lock_) + REQUIRES(!event_list_lock_) REQUIRES_SHARED(Locks::mutator_lock_); /* * Unregister all events. */ void UnregisterAll() - REQUIRES(!Locks::jdwp_event_list_lock_) + REQUIRES(!event_list_lock_) REQUIRES_SHARED(Locks::mutator_lock_); private: @@ -315,16 +310,16 @@ struct JdwpState { ObjectId threadId) REQUIRES_SHARED(Locks::mutator_lock_) REQUIRES(!jdwp_token_lock_); void CleanupMatchList(const std::vector<JdwpEvent*>& match_list) - REQUIRES(Locks::jdwp_event_list_lock_) REQUIRES_SHARED(Locks::mutator_lock_); + REQUIRES(event_list_lock_) REQUIRES_SHARED(Locks::mutator_lock_); void EventFinish(ExpandBuf* pReq); bool FindMatchingEvents(JdwpEventKind eventKind, const ModBasket& basket, std::vector<JdwpEvent*>* match_list) - REQUIRES(!Locks::jdwp_event_list_lock_) REQUIRES_SHARED(Locks::mutator_lock_); + REQUIRES(!event_list_lock_) REQUIRES_SHARED(Locks::mutator_lock_); void FindMatchingEventsLocked(JdwpEventKind eventKind, const ModBasket& basket, std::vector<JdwpEvent*>* match_list) - REQUIRES(Locks::jdwp_event_list_lock_) REQUIRES_SHARED(Locks::mutator_lock_); + REQUIRES(event_list_lock_) REQUIRES_SHARED(Locks::mutator_lock_); void UnregisterEvent(JdwpEvent* pEvent) - REQUIRES(Locks::jdwp_event_list_lock_) REQUIRES_SHARED(Locks::mutator_lock_); + REQUIRES(event_list_lock_) REQUIRES_SHARED(Locks::mutator_lock_); void SendBufferedRequest(uint32_t type, const std::vector<iovec>& iov); /* @@ -392,8 +387,9 @@ struct JdwpState { AtomicInteger event_serial_; // Linked list of events requested by the debugger (breakpoints, class prep, etc). - JdwpEvent* event_list_ GUARDED_BY(Locks::jdwp_event_list_lock_); - size_t event_list_size_ GUARDED_BY(Locks::jdwp_event_list_lock_); // Number of elements in event_list_. + Mutex event_list_lock_ DEFAULT_MUTEX_ACQUIRED_AFTER ACQUIRED_BEFORE(Locks::breakpoint_lock_); + JdwpEvent* event_list_ GUARDED_BY(event_list_lock_); + size_t event_list_size_ GUARDED_BY(event_list_lock_); // Number of elements in event_list_. // Used to synchronize JDWP command handler thread and event threads so only one // thread does JDWP stuff at a time. This prevent from interleaving command handling @@ -414,7 +410,7 @@ struct JdwpState { // When the runtime shuts down, it needs to stop JDWP command handler thread by closing the // JDWP connection. However, if the JDWP thread is processing a command, it needs to wait // for the command to finish so we can send its reply before closing the connection. - Mutex shutdown_lock_ ACQUIRED_AFTER(Locks::jdwp_event_list_lock_); + Mutex shutdown_lock_ ACQUIRED_AFTER(event_list_lock_); ConditionVariable shutdown_cond_ GUARDED_BY(shutdown_lock_); bool processing_request_ GUARDED_BY(shutdown_lock_); }; diff --git a/runtime/jdwp/jdwp_event.cc b/runtime/jdwp/jdwp_event.cc index 36d733ea08..96249f9b58 100644 --- a/runtime/jdwp/jdwp_event.cc +++ b/runtime/jdwp/jdwp_event.cc @@ -237,7 +237,7 @@ JdwpError JdwpState::RegisterEvent(JdwpEvent* pEvent) { /* * Add to list. */ - MutexLock mu(Thread::Current(), *Locks::jdwp_event_list_lock_); + MutexLock mu(Thread::Current(), event_list_lock_); if (event_list_ != nullptr) { pEvent->next = event_list_; event_list_->prev = pEvent; @@ -256,7 +256,7 @@ void JdwpState::UnregisterLocationEventsOnClass(ObjPtr<mirror::Class> klass) { StackHandleScope<1> hs(Thread::Current()); Handle<mirror::Class> h_klass(hs.NewHandle(klass)); std::vector<JdwpEvent*> to_remove; - MutexLock mu(Thread::Current(), *Locks::jdwp_event_list_lock_); + MutexLock mu(Thread::Current(), event_list_lock_); for (JdwpEvent* cur_event = event_list_; cur_event != nullptr; cur_event = cur_event->next) { // Fill in the to_remove list bool found_event = false; @@ -356,7 +356,7 @@ void JdwpState::UnregisterEvent(JdwpEvent* pEvent) { void JdwpState::UnregisterEventById(uint32_t requestId) { bool found = false; { - MutexLock mu(Thread::Current(), *Locks::jdwp_event_list_lock_); + MutexLock mu(Thread::Current(), event_list_lock_); for (JdwpEvent* pEvent = event_list_; pEvent != nullptr; pEvent = pEvent->next) { if (pEvent->requestId == requestId) { @@ -383,7 +383,7 @@ void JdwpState::UnregisterEventById(uint32_t requestId) { * Remove all entries from the event list. */ void JdwpState::UnregisterAll() { - MutexLock mu(Thread::Current(), *Locks::jdwp_event_list_lock_); + MutexLock mu(Thread::Current(), event_list_lock_); JdwpEvent* pEvent = event_list_; while (pEvent != nullptr) { @@ -593,7 +593,7 @@ void JdwpState::FindMatchingEventsLocked(JdwpEventKind event_kind, const ModBask */ bool JdwpState::FindMatchingEvents(JdwpEventKind event_kind, const ModBasket& basket, std::vector<JdwpEvent*>* match_list) { - MutexLock mu(Thread::Current(), *Locks::jdwp_event_list_lock_); + MutexLock mu(Thread::Current(), event_list_lock_); match_list->reserve(event_list_size_); FindMatchingEventsLocked(event_kind, basket, match_list); return !match_list->empty(); @@ -908,7 +908,7 @@ void JdwpState::PostLocationEvent(const EventLocation* pLoc, mirror::Object* thi std::vector<JdwpEvent*> match_list; { // We use the locked version because we have multiple possible match events. - MutexLock mu(Thread::Current(), *Locks::jdwp_event_list_lock_); + MutexLock mu(Thread::Current(), event_list_lock_); match_list.reserve(event_list_size_); if ((eventFlags & Dbg::kBreakpoint) != 0) { FindMatchingEventsLocked(EK_BREAKPOINT, basket, &match_list); @@ -955,7 +955,7 @@ void JdwpState::PostLocationEvent(const EventLocation* pLoc, mirror::Object* thi } { - MutexLock mu(Thread::Current(), *Locks::jdwp_event_list_lock_); + MutexLock mu(Thread::Current(), event_list_lock_); CleanupMatchList(match_list); } @@ -1041,7 +1041,7 @@ void JdwpState::PostFieldEvent(const EventLocation* pLoc, ArtField* field, } { - MutexLock mu(Thread::Current(), *Locks::jdwp_event_list_lock_); + MutexLock mu(Thread::Current(), event_list_lock_); CleanupMatchList(match_list); } @@ -1103,7 +1103,7 @@ void JdwpState::PostThreadChange(Thread* thread, bool start) { } { - MutexLock mu(Thread::Current(), *Locks::jdwp_event_list_lock_); + MutexLock mu(Thread::Current(), event_list_lock_); CleanupMatchList(match_list); } @@ -1213,7 +1213,7 @@ void JdwpState::PostException(const EventLocation* pThrowLoc, mirror::Throwable* } { - MutexLock mu(Thread::Current(), *Locks::jdwp_event_list_lock_); + MutexLock mu(Thread::Current(), event_list_lock_); CleanupMatchList(match_list); } @@ -1295,7 +1295,7 @@ void JdwpState::PostClassPrepare(mirror::Class* klass) { } { - MutexLock mu(Thread::Current(), *Locks::jdwp_event_list_lock_); + MutexLock mu(Thread::Current(), event_list_lock_); CleanupMatchList(match_list); } diff --git a/runtime/jdwp/jdwp_main.cc b/runtime/jdwp/jdwp_main.cc index 64ed724afc..7707ba4932 100644 --- a/runtime/jdwp/jdwp_main.cc +++ b/runtime/jdwp/jdwp_main.cc @@ -227,6 +227,7 @@ JdwpState::JdwpState(const JdwpOptions* options) last_activity_time_ms_(0), request_serial_(0x10000000), event_serial_(0x20000000), + event_list_lock_("JDWP event list lock", kJdwpEventListLock), event_list_(nullptr), event_list_size_(0), jdwp_token_lock_("JDWP token lock"), @@ -330,7 +331,7 @@ void JdwpState::ResetState() { UnregisterAll(); { - MutexLock mu(Thread::Current(), *Locks::jdwp_event_list_lock_); + MutexLock mu(Thread::Current(), event_list_lock_); CHECK(event_list_ == nullptr); } |