@@ -2641,7 +2641,9 @@ jint JvmtiExport::load_agent_library(const char *agent, const char *absParam,
26412641 void * library = NULL ;
26422642 jint result = JNI_ERR;
26432643 const char *on_attach_symbols[] = AGENT_ONATTACH_SYMBOLS;
2644- size_t num_symbol_entries = ARRAY_SIZE (on_attach_symbols);
2644+ size_t num_onattach_symbol_entries = ARRAY_SIZE (on_attach_symbols);
2645+ const char *on_unload_symbols[] = AGENT_ONUNLOAD_SYMBOLS;
2646+ size_t num_onunload_symbol_entries = ARRAY_SIZE (on_unload_symbols);
26452647
26462648 // The abs paramter should be "true" or "false"
26472649 bool is_absolute_path = (absParam != NULL ) && (strcmp (absParam," true" )==0 );
@@ -2653,7 +2655,7 @@ jint JvmtiExport::load_agent_library(const char *agent, const char *absParam,
26532655 // absolute we attempt to load the library. Otherwise we try to load it
26542656 // from the standard dll directory.
26552657
2656- if (!os::find_builtin_agent (agent_lib, on_attach_symbols, num_symbol_entries )) {
2658+ if (!os::find_builtin_agent (agent_lib, on_attach_symbols, num_onattach_symbol_entries )) {
26572659 if (is_absolute_path) {
26582660 library = os::dll_load (agent, ebuf, sizeof ebuf);
26592661 } else {
@@ -2677,10 +2679,13 @@ jint JvmtiExport::load_agent_library(const char *agent, const char *absParam,
26772679 // If the library was loaded then we attempt to invoke the Agent_OnAttach
26782680 // function
26792681 if (agent_lib->valid ()) {
2682+ JavaThread* THREAD = JavaThread::current ();
2683+ extern struct JavaVM_ main_vm;
2684+
26802685 // Lookup the Agent_OnAttach function
26812686 OnAttachEntry_t on_attach_entry = NULL ;
26822687 on_attach_entry = CAST_TO_FN_PTR (OnAttachEntry_t,
2683- os::find_agent_function (agent_lib, false , on_attach_symbols, num_symbol_entries ));
2688+ os::find_agent_function (agent_lib, false , on_attach_symbols, num_onattach_symbol_entries ));
26842689 if (on_attach_entry == NULL ) {
26852690 // Agent_OnAttach missing - unload library
26862691 if (!agent_lib->is_static_lib ()) {
@@ -2691,9 +2696,7 @@ jint JvmtiExport::load_agent_library(const char *agent, const char *absParam,
26912696 delete agent_lib;
26922697 } else {
26932698 // Invoke the Agent_OnAttach function
2694- JavaThread* THREAD = JavaThread::current ();
26952699 {
2696- extern struct JavaVM_ main_vm;
26972700 JvmtiThreadEventMark jem (THREAD);
26982701 JvmtiJavaThreadEventTransition jet (THREAD);
26992702
@@ -2710,6 +2713,23 @@ jint JvmtiExport::load_agent_library(const char *agent, const char *absParam,
27102713 if (result == JNI_OK) {
27112714 Arguments::add_loaded_agent (agent_lib);
27122715 } else {
2716+ // Find the Agent_OnUnload function.
2717+ Agent_OnUnload_t unload_entry = CAST_TO_FN_PTR (Agent_OnUnload_t,
2718+ os::find_agent_function (agent_lib,
2719+ false ,
2720+ on_unload_symbols,
2721+ num_onunload_symbol_entries));
2722+ // Invoke the Agent_OnUnload function
2723+ if (unload_entry != NULL ) {
2724+ JvmtiThreadEventMark jem (THREAD);
2725+ JvmtiJavaThreadEventTransition jet (THREAD);
2726+
2727+ (*unload_entry)(&main_vm);
2728+ }
2729+
2730+ if (!agent_lib->is_static_lib ()) {
2731+ os::dll_unload (library);
2732+ }
27132733 delete agent_lib;
27142734 }
27152735
0 commit comments