diff options
Diffstat (limited to 'openjdkjvmti')
| -rw-r--r-- | openjdkjvmti/Android.bp | 3 | ||||
| -rw-r--r-- | openjdkjvmti/OpenjdkJvmTi.cc | 61 | ||||
| -rw-r--r-- | openjdkjvmti/deopt_manager.cc | 6 | ||||
| -rw-r--r-- | openjdkjvmti/events.cc | 5 | ||||
| -rw-r--r-- | openjdkjvmti/transform.cc | 2 |
5 files changed, 46 insertions, 31 deletions
diff --git a/openjdkjvmti/Android.bp b/openjdkjvmti/Android.bp index 1500bcae24..1553b78f46 100644 --- a/openjdkjvmti/Android.bp +++ b/openjdkjvmti/Android.bp @@ -58,7 +58,6 @@ cc_defaults { "libopenjdkjvmti_headers", ], shared_libs: [ - "libdexfile", "libbase", ], } @@ -70,6 +69,7 @@ art_cc_library { "libart", "libart-compiler", "libart-dexlayout", + "libdexfile", ], } @@ -83,5 +83,6 @@ art_cc_library { "libartd", "libartd-compiler", "libartd-dexlayout", + "libdexfiled", ], } diff --git a/openjdkjvmti/OpenjdkJvmTi.cc b/openjdkjvmti/OpenjdkJvmTi.cc index a0c7f40b6f..ef5151990c 100644 --- a/openjdkjvmti/OpenjdkJvmTi.cc +++ b/openjdkjvmti/OpenjdkJvmTi.cc @@ -73,8 +73,10 @@ namespace openjdkjvmti { -EventHandler gEventHandler; -DeoptManager gDeoptManager; +// NB These are heap allocated to avoid the static destructors being run if an agent calls exit(3). +// These should never be null. +EventHandler* gEventHandler; +DeoptManager* gDeoptManager; #define ENSURE_NON_NULL(n) \ do { \ @@ -776,7 +778,7 @@ class JvmtiFunctions { ENSURE_HAS_CAP(env, can_retransform_classes); std::string error_msg; jvmtiError res = Transformer::RetransformClasses(ArtJvmTiEnv::AsArtJvmTiEnv(env), - &gEventHandler, + gEventHandler, art::Runtime::Current(), art::Thread::Current(), class_count, @@ -795,7 +797,7 @@ class JvmtiFunctions { ENSURE_HAS_CAP(env, can_redefine_classes); std::string error_msg; jvmtiError res = Redefiner::RedefineClasses(ArtJvmTiEnv::AsArtJvmTiEnv(env), - &gEventHandler, + gEventHandler, art::Runtime::Current(), art::Thread::Current(), class_count, @@ -1061,7 +1063,10 @@ class JvmtiFunctions { } ArtJvmTiEnv* art_env = ArtJvmTiEnv::AsArtJvmTiEnv(env); - return gEventHandler.SetEvent(art_env, art_thread, GetArtJvmtiEvent(art_env, event_type), mode); + return gEventHandler->SetEvent(art_env, + art_thread, + GetArtJvmtiEvent(art_env, event_type), + mode); } static jvmtiError GenerateEvents(jvmtiEnv* env, @@ -1095,7 +1100,7 @@ class JvmtiFunctions { return ExtensionUtil::SetExtensionEventCallback(env, extension_event_index, callback, - &gEventHandler); + gEventHandler); } #define FOR_ALL_CAPABILITIES(FUN) \ @@ -1186,9 +1191,9 @@ class JvmtiFunctions { FOR_ALL_CAPABILITIES(ADD_CAPABILITY); #undef ADD_CAPABILITY - gEventHandler.HandleChangedCapabilities(ArtJvmTiEnv::AsArtJvmTiEnv(env), - changed, - /*added*/true); + gEventHandler->HandleChangedCapabilities(ArtJvmTiEnv::AsArtJvmTiEnv(env), + changed, + /*added*/true); return ret; } @@ -1210,9 +1215,9 @@ class JvmtiFunctions { FOR_ALL_CAPABILITIES(DEL_CAPABILITY); #undef DEL_CAPABILITY - gEventHandler.HandleChangedCapabilities(ArtJvmTiEnv::AsArtJvmTiEnv(env), - changed, - /*added*/false); + gEventHandler->HandleChangedCapabilities(ArtJvmTiEnv::AsArtJvmTiEnv(env), + changed, + /*added*/false); return OK; } @@ -1302,7 +1307,7 @@ class JvmtiFunctions { static jvmtiError DisposeEnvironment(jvmtiEnv* env) { ENSURE_VALID_ENV(env); ArtJvmTiEnv* tienv = ArtJvmTiEnv::AsArtJvmTiEnv(env); - gEventHandler.RemoveArtJvmTiEnv(tienv); + gEventHandler->RemoveArtJvmTiEnv(tienv); art::Runtime::Current()->RemoveSystemWeakHolder(tienv->object_tag_table.get()); ThreadUtil::RemoveEnvironment(tienv); delete tienv; @@ -1490,10 +1495,10 @@ ArtJvmTiEnv::ArtJvmTiEnv(art::JavaVMExt* runtime, EventHandler* event_handler, j // Creates a jvmtiEnv and returns it with the art::ti::Env that is associated with it. new_art_ti // is a pointer to the uninitialized memory for an art::ti::Env. static void CreateArtJvmTiEnv(art::JavaVMExt* vm, jint version, /*out*/void** new_jvmtiEnv) { - struct ArtJvmTiEnv* env = new ArtJvmTiEnv(vm, &gEventHandler, version); + struct ArtJvmTiEnv* env = new ArtJvmTiEnv(vm, gEventHandler, version); *new_jvmtiEnv = env; - gEventHandler.RegisterArtJvmTiEnv(env); + gEventHandler->RegisterArtJvmTiEnv(env); art::Runtime::Current()->AddSystemWeakHolder( ArtJvmTiEnv::AsArtJvmTiEnv(env)->object_tag_table.get()); @@ -1522,17 +1527,20 @@ static jint GetEnvHandler(art::JavaVMExt* vm, /*out*/void** env, jint version) { extern "C" bool ArtPlugin_Initialize() { art::Runtime* runtime = art::Runtime::Current(); - gDeoptManager.Setup(); + gDeoptManager = new DeoptManager; + gEventHandler = new EventHandler; + + gDeoptManager->Setup(); if (runtime->IsStarted()) { PhaseUtil::SetToLive(); } else { PhaseUtil::SetToOnLoad(); } - PhaseUtil::Register(&gEventHandler); - ThreadUtil::Register(&gEventHandler); - ClassUtil::Register(&gEventHandler); - DumpUtil::Register(&gEventHandler); - MethodUtil::Register(&gEventHandler); + PhaseUtil::Register(gEventHandler); + ThreadUtil::Register(gEventHandler); + ClassUtil::Register(gEventHandler); + DumpUtil::Register(gEventHandler); + MethodUtil::Register(gEventHandler); SearchUtil::Register(); HeapUtil::Register(); Transformer::Setup(); @@ -1540,7 +1548,7 @@ extern "C" bool ArtPlugin_Initialize() { { // Make sure we can deopt anything we need to. art::ScopedObjectAccess soa(art::Thread::Current()); - gDeoptManager.FinishSetup(); + gDeoptManager->FinishSetup(); } runtime->GetJavaVM()->AddEnvironmentHook(GetEnvHandler); @@ -1549,8 +1557,8 @@ extern "C" bool ArtPlugin_Initialize() { } extern "C" bool ArtPlugin_Deinitialize() { - gEventHandler.Shutdown(); - gDeoptManager.Shutdown(); + gEventHandler->Shutdown(); + gDeoptManager->Shutdown(); PhaseUtil::Unregister(); ThreadUtil::Unregister(); ClassUtil::Unregister(); @@ -1559,6 +1567,11 @@ extern "C" bool ArtPlugin_Deinitialize() { SearchUtil::Unregister(); HeapUtil::Unregister(); + // TODO It would be good to delete the gEventHandler and gDeoptManager here but we cannot since + // daemon threads might be suspended and we want to make sure that even if they wake up briefly + // they won't hit deallocated memory. By this point none of the functions will do anything since + // they have already shutdown. + return true; } diff --git a/openjdkjvmti/deopt_manager.cc b/openjdkjvmti/deopt_manager.cc index 9e11a25e58..6d84ffa53f 100644 --- a/openjdkjvmti/deopt_manager.cc +++ b/openjdkjvmti/deopt_manager.cc @@ -277,7 +277,7 @@ void DeoptManager::AddDeoptimizeAllMethodsLocked(art::Thread* self) { } void DeoptManager::RemoveDeoptimizeAllMethodsLocked(art::Thread* self) { - DCHECK_GT(global_deopt_count_, 0u) << "Request to remove non-existant global deoptimization!"; + DCHECK_GT(global_deopt_count_, 0u) << "Request to remove non-existent global deoptimization!"; global_deopt_count_--; if (global_deopt_count_ == 0) { PerformGlobalUndeoptimization(self); @@ -343,9 +343,9 @@ void DeoptManager::DeoptimizeThread(art::Thread* target) { art::Runtime::Current()->GetInstrumentation()->InstrumentThreadStack(target); } -extern DeoptManager gDeoptManager; +extern DeoptManager* gDeoptManager; DeoptManager* DeoptManager::Get() { - return &gDeoptManager; + return gDeoptManager; } } // namespace openjdkjvmti diff --git a/openjdkjvmti/events.cc b/openjdkjvmti/events.cc index 62b73c08c0..8b40a7e072 100644 --- a/openjdkjvmti/events.cc +++ b/openjdkjvmti/events.cc @@ -1186,8 +1186,9 @@ void EventHandler::Shutdown() { art::Runtime::Current()->GetInstrumentation()->RemoveListener(method_trace_listener_.get(), ~0); } -EventHandler::EventHandler() : envs_lock_("JVMTI Environment List Lock", - art::LockLevel::kTopLockLevel) { +EventHandler::EventHandler() + : envs_lock_("JVMTI Environment List Lock", art::LockLevel::kTopLockLevel), + frame_pop_enabled(false) { alloc_listener_.reset(new JvmtiAllocationListener(this)); ddm_listener_.reset(new JvmtiDdmChunkListener(this)); gc_pause_listener_.reset(new JvmtiGcPauseListener(this)); diff --git a/openjdkjvmti/transform.cc b/openjdkjvmti/transform.cc index dc9f69a96a..43b8fe94f4 100644 --- a/openjdkjvmti/transform.cc +++ b/openjdkjvmti/transform.cc @@ -124,7 +124,7 @@ class TransformationFaultHandler FINAL : public art::FaultHandler { return std::find_if(initialized_class_definitions_.begin(), initialized_class_definitions_.end(), [&](const auto op) { return op->ContainsAddress(ptr); }) != - uninitialized_class_definitions_.end(); + initialized_class_definitions_.end(); } } |