You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@harmony.apache.org by gs...@apache.org on 2006/12/11 22:47:03 UTC
svn commit: r485888 - in /harmony/enhanced/drlvm/trunk/vm/vmcore: include/
src/init/ src/jni/ src/jvmti/ src/thread/ src/util/win/
Author: gshimansky
Date: Mon Dec 11 13:47:02 2006
New Revision: 485888
URL: http://svn.apache.org/viewvc?view=rev&rev=485888
Log:
Applied HARMONY-2539 [drlvm][jvmti] DataDumpRequest event implementation
Tests passed on ubuntu6 x86, windows XP and Gentoo x86_64
Modified:
harmony/enhanced/drlvm/trunk/vm/vmcore/include/jvmti_direct.h
harmony/enhanced/drlvm/trunk/vm/vmcore/include/jvmti_internal.h
harmony/enhanced/drlvm/trunk/vm/vmcore/src/init/vm_init.cpp
harmony/enhanced/drlvm/trunk/vm/vmcore/src/init/vm_shutdown.cpp
harmony/enhanced/drlvm/trunk/vm/vmcore/src/jni/jni.cpp
harmony/enhanced/drlvm/trunk/vm/vmcore/src/jvmti/jvmti.cpp
harmony/enhanced/drlvm/trunk/vm/vmcore/src/jvmti/jvmti_event.cpp
harmony/enhanced/drlvm/trunk/vm/vmcore/src/thread/thread_manager.cpp
harmony/enhanced/drlvm/trunk/vm/vmcore/src/util/win/nt_platform_utils.cpp
Modified: harmony/enhanced/drlvm/trunk/vm/vmcore/include/jvmti_direct.h
URL: http://svn.apache.org/viewvc/harmony/enhanced/drlvm/trunk/vm/vmcore/include/jvmti_direct.h?view=diff&rev=485888&r1=485887&r2=485888
==============================================================================
--- harmony/enhanced/drlvm/trunk/vm/vmcore/include/jvmti_direct.h (original)
+++ harmony/enhanced/drlvm/trunk/vm/vmcore/include/jvmti_direct.h Mon Dec 11 13:47:02 2006
@@ -132,6 +132,9 @@
VMEXPORT void jvmti_process_native_method_bind_event(jmethodID method,
NativeCodePtr address, NativeCodePtr* new_address_ptr);
void jvmti_clean_reclaimed_object_tags();
+void jvmti_create_event_thread();
+void jvmti_destroy_event_thread();
+void jvmti_notify_data_dump_request();
#ifdef __cplusplus
}
Modified: harmony/enhanced/drlvm/trunk/vm/vmcore/include/jvmti_internal.h
URL: http://svn.apache.org/viewvc/harmony/enhanced/drlvm/trunk/vm/vmcore/include/jvmti_internal.h?view=diff&rev=485888&r1=485887&r2=485888
==============================================================================
--- harmony/enhanced/drlvm/trunk/vm/vmcore/include/jvmti_internal.h (original)
+++ harmony/enhanced/drlvm/trunk/vm/vmcore/include/jvmti_internal.h Mon Dec 11 13:47:02 2006
@@ -149,10 +149,13 @@
public:
jint agent_counter;
Lock_Manager TIenvs_lock;
- Lock_Manager dcList_lock;
VMBreakPoints* vm_brpt;
hythread_tls_key_t TL_ti_enabled; //thread local TI flag
+ // TI event thread data
+ hythread_t event_thread;
+ hycond_t event_cond;
+
DebugUtilsTI();
~DebugUtilsTI();
@@ -167,6 +170,10 @@
void setEnabled();
void setDisabled();
+ bool needCreateEventThread();
+ void enableEventThreadCreation();
+ void disableEventThreadCreation();
+
bool isLocallyEnabled();
void setLocallyEnabled();
void setLocallyDisabled();
@@ -327,6 +334,7 @@
Watch *access_watch_list;
Watch *modification_watch_list;
bool status;
+ bool need_create_event_thread;
Agent* agents;
TIEnv* p_TIenvs;
jvmtiPhase phase;
Modified: harmony/enhanced/drlvm/trunk/vm/vmcore/src/init/vm_init.cpp
URL: http://svn.apache.org/viewvc/harmony/enhanced/drlvm/trunk/vm/vmcore/src/init/vm_init.cpp?view=diff&rev=485888&r1=485887&r2=485888
==============================================================================
--- harmony/enhanced/drlvm/trunk/vm/vmcore/src/init/vm_init.cpp (original)
+++ harmony/enhanced/drlvm/trunk/vm/vmcore/src/init/vm_init.cpp Mon Dec 11 13:47:02 2006
@@ -791,6 +791,12 @@
} else {
vm_env->finalizer_thread = NULL;
}
+ if(vm_env->TI->isEnabled() && vm_env->TI->needCreateEventThread() ) {
+ vm_env->TI->TIenvs_lock._lock();
+ jvmti_create_event_thread();
+ vm_env->TI->disableEventThreadCreation();
+ vm_env->TI->TIenvs_lock._unlock();
+ }
TRACE("initialization of system classes completed");
Modified: harmony/enhanced/drlvm/trunk/vm/vmcore/src/init/vm_shutdown.cpp
URL: http://svn.apache.org/viewvc/harmony/enhanced/drlvm/trunk/vm/vmcore/src/init/vm_shutdown.cpp?view=diff&rev=485888&r1=485887&r2=485888
==============================================================================
--- harmony/enhanced/drlvm/trunk/vm/vmcore/src/init/vm_shutdown.cpp (original)
+++ harmony/enhanced/drlvm/trunk/vm/vmcore/src/init/vm_shutdown.cpp Mon Dec 11 13:47:02 2006
@@ -181,10 +181,11 @@
}
void quit_handler(int UNREF x) {
+ jvmti_notify_data_dump_request();
if (interpreter_enabled()) {
- dump_all_java_stacks();
+ dump_all_java_stacks();
} else {
- td_dump_all_threads(stderr);
+ td_dump_all_threads(stderr);
}
}
Modified: harmony/enhanced/drlvm/trunk/vm/vmcore/src/jni/jni.cpp
URL: http://svn.apache.org/viewvc/harmony/enhanced/drlvm/trunk/vm/vmcore/src/jni/jni.cpp?view=diff&rev=485888&r1=485887&r2=485888
==============================================================================
--- harmony/enhanced/drlvm/trunk/vm/vmcore/src/jni/jni.cpp (original)
+++ harmony/enhanced/drlvm/trunk/vm/vmcore/src/jni/jni.cpp Mon Dec 11 13:47:02 2006
@@ -1519,11 +1519,13 @@
assert(jthread_self() != NULL);
// Now JVMTIThread keeps global reference. Discared temporary global reference.
- jni_env->DeleteGlobalRef(java_thread);
+ jni_env->DeleteGlobalRef(java_thread);
// Send thread start event.
// TODO: Thread start event should be sent before its initial method executes.
- jvmti_send_thread_start_end_event(1);
+ // 20061207: psrebriy: ThreadStart event is already started in
+ // jthread_attach function
+ // jvmti_send_thread_start_end_event(1);
return status == TM_ERROR_NONE ? JNI_OK : JNI_ERR;
}
Modified: harmony/enhanced/drlvm/trunk/vm/vmcore/src/jvmti/jvmti.cpp
URL: http://svn.apache.org/viewvc/harmony/enhanced/drlvm/trunk/vm/vmcore/src/jvmti/jvmti.cpp?view=diff&rev=485888&r1=485887&r2=485888
==============================================================================
--- harmony/enhanced/drlvm/trunk/vm/vmcore/src/jvmti/jvmti.cpp (original)
+++ harmony/enhanced/drlvm/trunk/vm/vmcore/src/jvmti/jvmti.cpp Mon Dec 11 13:47:02 2006
@@ -308,10 +308,13 @@
}
DebugUtilsTI::DebugUtilsTI() :
+ event_thread(NULL),
+ event_cond(NULL),
agent_counter(1),
access_watch_list(NULL),
modification_watch_list(NULL),
status(false),
+ need_create_event_thread(false),
agents(NULL),
p_TIenvs(NULL),
MAX_NOTIFY_LIST(1000),
@@ -339,6 +342,7 @@
ReleaseNotifyLists();
hythread_tls_free(TL_ti_enabled);
delete vm_brpt;
+ jvmti_destroy_event_thread();
return;
}
@@ -731,6 +735,20 @@
void DebugUtilsTI::setDisabled() {
this->status = false;
+ return;
+}
+
+bool DebugUtilsTI::needCreateEventThread() {
+ return need_create_event_thread;
+}
+
+void DebugUtilsTI::enableEventThreadCreation() {
+ need_create_event_thread = true;
+ return;
+}
+
+void DebugUtilsTI::disableEventThreadCreation() {
+ need_create_event_thread = false;
return;
}
Modified: harmony/enhanced/drlvm/trunk/vm/vmcore/src/jvmti/jvmti_event.cpp
URL: http://svn.apache.org/viewvc/harmony/enhanced/drlvm/trunk/vm/vmcore/src/jvmti/jvmti_event.cpp?view=diff&rev=485888&r1=485887&r2=485888
==============================================================================
--- harmony/enhanced/drlvm/trunk/vm/vmcore/src/jvmti/jvmti_event.cpp (original)
+++ harmony/enhanced/drlvm/trunk/vm/vmcore/src/jvmti/jvmti_event.cpp Mon Dec 11 13:47:02 2006
@@ -164,6 +164,22 @@
return false;
}
+static inline bool
+check_event_is_disable( jvmtiEvent event_type,
+ DebugUtilsTI *ti)
+{
+ for (TIEnv *ti_env = ti->getEnvironments(); ti_env;
+ ti_env = ti_env->next)
+ {
+ if (ti_env->global_events[event_type - JVMTI_MIN_EVENT_TYPE_VAL]
+ || ti_env->event_threads[event_type - JVMTI_MIN_EVENT_TYPE_VAL])
+ {
+ return false;
+ }
+ }
+ return true;
+}
+
/*
* Set Event Notification Mode
*
@@ -308,6 +324,7 @@
else
return JVMTI_ERROR_ILLEGAL_ARGUMENT;
+ DebugUtilsTI *ti = ((TIEnv *)env)->vm->vm_env->TI;
if (event_enabled(event_type) != (jboolean)old_state) {
if (interpreter_enabled())
interpreter.interpreter_ti_set_notification_mode(event_type, !old_state);
@@ -315,8 +332,6 @@
{
if (JVMTI_EVENT_SINGLE_STEP == event_type)
{
- DebugUtilsTI *ti = ((TIEnv *)env)->vm->vm_env->TI;
-
if (JVMTI_ENABLE == mode && !ti->is_single_step_enabled())
{
TRACE2("jvmti.break.ss", "SingleStep event is enabled");
@@ -329,35 +344,32 @@
{
// Check that no environment has SingleStep enabled
LMAutoUnlock lock(&ti->TIenvs_lock);
- bool disable = true;
TRACE2("jvmti.break.ss",
"SingleStep event is disabled locally for env: "
<< env);
-
- for (TIEnv *ti_env = ti->getEnvironments(); ti_env;
- ti_env = ti_env->next)
- {
- if (ti_env->global_events[JVMTI_EVENT_SINGLE_STEP -
- JVMTI_MIN_EVENT_TYPE_VAL] ||
- NULL != ti_env->event_threads[JVMTI_EVENT_SINGLE_STEP -
- JVMTI_MIN_EVENT_TYPE_VAL])
- {
- disable = false;
- break;
- }
- }
-
- if (disable)
- {
+ bool disable = check_event_is_disable(JVMTI_EVENT_SINGLE_STEP, ti);
+ if (disable) {
TRACE2("jvmti.break.ss", "SingleStep event is disabled");
jvmtiError errorCode = ti->jvmti_single_step_stop();
-
if (JVMTI_ERROR_NONE != errorCode)
return errorCode;
}
}
}
}
+ if( JVMTI_EVENT_DATA_DUMP_REQUEST == event_type ) {
+ if(JVMTI_ENABLE == mode) {
+ LMAutoUnlock lock(&ti->TIenvs_lock);
+ jvmti_create_event_thread();
+ } else {
+ LMAutoUnlock lock(&ti->TIenvs_lock);
+ bool disable =
+ check_event_is_disable(JVMTI_EVENT_DATA_DUMP_REQUEST, ti);
+ if (disable) {
+ jvmti_destroy_event_thread();
+ }
+ }
+ }
}
return JVMTI_ERROR_NONE;
@@ -2014,4 +2026,162 @@
}
ti_env = next_env;
}
+}
+
+static void
+jvmti_process_data_dump_request()
+{
+ assert(hythread_is_suspend_enabled());
+ DebugUtilsTI *ti = VM_Global_State::loader_env->TI;
+ if( !ti->isEnabled() ) {
+ return;
+ }
+
+ //Checking current phase
+ jvmtiPhase phase = ti->getPhase();
+ if( ti->getPhase() != JVMTI_PHASE_LIVE ) {
+ return;
+ }
+ hythread_t thread = hythread_self();
+
+ TIEnv* next_env;
+ for (TIEnv* env = ti->getEnvironments(); env; env = next_env) {
+ next_env = env->next;
+
+ jvmtiEventDataDumpRequest callback = env->event_table.DataDumpRequest;
+
+ if( NULL == callback ) {
+ continue;
+ }
+
+ if( env->global_events[JVMTI_EVENT_DATA_DUMP_REQUEST
+ - JVMTI_MIN_EVENT_TYPE_VAL] )
+ {
+ TRACE2("jvmti.event", "Calling global DataDumpRequest event");
+ callback((jvmtiEnv*)env);
+ continue;
+ }
+
+ TIEventThread *first_et =
+ env->event_threads[JVMTI_EVENT_DATA_DUMP_REQUEST - JVMTI_MIN_EVENT_TYPE_VAL];
+ for( TIEventThread *et = first_et; NULL != et; et = et->next )
+ {
+ if( et->thread == thread ) {
+ TRACE2("jvmti.event", "Calling local DataDumpRequest event");
+ callback((jvmtiEnv*)env);
+ }
+ }
+ }
+}
+
+static int VMCALL
+jvmti_event_thread_function(void *args)
+{
+ DebugUtilsTI *ti = VM_Global_State::loader_env->TI;
+ JNIEnv* jni_env = (JNIEnv*)args;
+ JavaVM* java_vm;
+ jni_env->GetJavaVM(&java_vm);
+
+ // attaching native thread to VM
+ JavaVMAttachArgs vm_args = {JNI_VERSION_1_2, "TIEventThread", NULL};
+ int status = AttachCurrentThreadAsDaemon(java_vm, (void**)&jni_env, &vm_args);
+ if(status != JNI_OK) {
+ DIE("jvmti_event_thread_function: cannot attach current thread");
+ }
+
+ assert(hythread_is_suspend_enabled());
+
+ // create wait loop environment
+ hymutex_t event_mutex;
+ UNREF IDATA stat = hymutex_create(&event_mutex, TM_MUTEX_NESTED);
+ assert(stat == TM_ERROR_NONE);
+ hycond_t event_cond;
+ stat = hycond_create(&event_cond);
+ assert(stat == TM_ERROR_NONE);
+ ti->event_cond = event_cond;
+
+ // event thread loop
+ while(true) {
+ hymutex_lock(event_mutex);
+ hycond_wait(event_cond, event_mutex);
+ hymutex_unlock(event_mutex);
+
+ if(!ti->event_thread) {
+ // event thread is NULL,
+ // it's time to terminate the current thread
+ break;
+ }
+
+ // process data dump request
+ jvmti_process_data_dump_request();
+ }
+
+ // release wait loop environment
+ stat = hymutex_destroy(event_mutex);
+ assert(stat == TM_ERROR_NONE);
+ stat = hycond_destroy(event_cond);
+ assert(stat == TM_ERROR_NONE);
+
+ return 0;
+}
+
+void
+jvmti_create_event_thread()
+{
+ // IMPORTANT: The function is called under TIenvs_lock
+ DebugUtilsTI *ti = VM_Global_State::loader_env->TI;
+ if(ti->event_thread) {
+ // event thread is already created
+ return;
+ }
+
+ if(ti->getPhase() < JVMTI_PHASE_LIVE) {
+ ti->enableEventThreadCreation();
+ return;
+ }
+
+ // create TI event thread
+ JNIEnv *jni_env = p_TLS_vmthread->jni_env;
+ IDATA status = hythread_create(&ti->event_thread, 0, 0, 0,
+ jvmti_event_thread_function, jni_env);
+ if( status != TM_ERROR_NONE ) {
+ DIE("jvmti_create_event_thread: creating thread is failed!");
+ }
+ return;
+}
+
+void
+jvmti_destroy_event_thread()
+{
+ // IMPORTANT: The function is called under TIenvs_lock
+ DebugUtilsTI *ti = VM_Global_State::loader_env->TI;
+ if(!ti->event_thread) {
+ // event thread is already destroyed
+ return;
+ }
+
+ // getting condition
+ hycond_t event_cond = ti->event_cond;
+ ti->event_thread = NULL;
+ ti->event_cond = NULL;
+
+ // notify event thread
+ assert(event_cond);
+ UNREF IDATA stat = hycond_notify(event_cond);
+ assert(stat == TM_ERROR_NONE);
+ return;
+}
+
+void
+jvmti_notify_data_dump_request()
+{
+ DebugUtilsTI *ti = VM_Global_State::loader_env->TI;
+ if( !ti->event_thread || !ti->event_cond ) {
+ // nothing to do
+ return;
+ }
+ assert(ti->event_cond);
+ UNREF IDATA stat = hycond_notify(ti->event_cond);
+ assert(stat == TM_ERROR_NONE);
+ return;
}
Modified: harmony/enhanced/drlvm/trunk/vm/vmcore/src/thread/thread_manager.cpp
URL: http://svn.apache.org/viewvc/harmony/enhanced/drlvm/trunk/vm/vmcore/src/thread/thread_manager.cpp?view=diff&rev=485888&r1=485887&r2=485888
==============================================================================
--- harmony/enhanced/drlvm/trunk/vm/vmcore/src/thread/thread_manager.cpp (original)
+++ harmony/enhanced/drlvm/trunk/vm/vmcore/src/thread/thread_manager.cpp Mon Dec 11 13:47:02 2006
@@ -149,6 +149,7 @@
}
IDATA jthread_throw_exception(char* name, char* message) {
+ assert(hythread_is_suspend_enabled());
jobject jthe = exn_create(name);
return jthread_throw_exception_object(jthe);
}
Modified: harmony/enhanced/drlvm/trunk/vm/vmcore/src/util/win/nt_platform_utils.cpp
URL: http://svn.apache.org/viewvc/harmony/enhanced/drlvm/trunk/vm/vmcore/src/util/win/nt_platform_utils.cpp?view=diff&rev=485888&r1=485887&r2=485888
==============================================================================
--- harmony/enhanced/drlvm/trunk/vm/vmcore/src/util/win/nt_platform_utils.cpp (original)
+++ harmony/enhanced/drlvm/trunk/vm/vmcore/src/util/win/nt_platform_utils.cpp Mon Dec 11 13:47:02 2006
@@ -35,7 +35,7 @@
#include "exception_filter.h"
BOOL ctrl_handler(DWORD ctrlType)
-{
+{
switch (ctrlType)
{
case CTRL_BREAK_EVENT: