You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@harmony.apache.org by wj...@apache.org on 2007/02/22 19:53:51 UTC
svn commit: r510623 - in /harmony/enhanced/drlvm/trunk/vm: include/open/
tests/unit/thread/ thread/src/ vmcore/include/ vmcore/src/init/
vmcore/src/thread/
Author: wjwashburn
Date: Thu Feb 22 10:53:49 2007
New Revision: 510623
URL: http://svn.apache.org/viewvc?view=rev&rev=510623
Log:
Harmony-2963, moves child thread memory allocation to parent, moves non-daemon thread
count to wrapper_proc
build, build test pass on winxp and linux rhel 4.0 w/ gcc 4.0.2
Modified:
harmony/enhanced/drlvm/trunk/vm/include/open/thread_externals.h
harmony/enhanced/drlvm/trunk/vm/tests/unit/thread/test_java_basic.c
harmony/enhanced/drlvm/trunk/vm/thread/src/thread_java_basic.c
harmony/enhanced/drlvm/trunk/vm/vmcore/include/thread_manager.h
harmony/enhanced/drlvm/trunk/vm/vmcore/src/init/finalizer_thread.cpp
harmony/enhanced/drlvm/trunk/vm/vmcore/src/init/ref_enqueue_thread.cpp
harmony/enhanced/drlvm/trunk/vm/vmcore/src/init/vm_init.cpp
harmony/enhanced/drlvm/trunk/vm/vmcore/src/thread/thread_generic.cpp
harmony/enhanced/drlvm/trunk/vm/vmcore/src/thread/thread_manager.cpp
Modified: harmony/enhanced/drlvm/trunk/vm/include/open/thread_externals.h
URL: http://svn.apache.org/viewvc/harmony/enhanced/drlvm/trunk/vm/include/open/thread_externals.h?view=diff&rev=510623&r1=510622&r2=510623
==============================================================================
--- harmony/enhanced/drlvm/trunk/vm/include/open/thread_externals.h (original)
+++ harmony/enhanced/drlvm/trunk/vm/include/open/thread_externals.h Thu Feb 22 10:53:49 2007
@@ -72,8 +72,10 @@
*
* @param[in] java_vm - current thread will be attached to the specified VM
* @param[out] p_jni_env - will point to JNI environment assocciated with the thread
+ * @param[in] vm_thread_dummies - memory preallocated for Java thread structures (if NULL, memory will be allocated automatically)
*/
-VMEXPORT jint vm_attach(JavaVM * java_vm, JNIEnv ** p_jni_env);
+VMEXPORT jint vm_attach(JavaVM * java_vm, JNIEnv ** p_jni_env,
+ void *vm_thread_dummies);
/**
* Frees java related resources before thread exit.
@@ -118,6 +120,14 @@
* @return <code>int</code>
*/
VMEXPORT int ti_is_enabled();
+
+/**
+ * Allocates memory needed for creating new vm thread
+ *
+ * @param[in] java_vm - current thread will be attached to the specified VM
+ */
+
+VMEXPORT void *vm_allocate_thread_dummies(JavaVM *java_vm);
#ifdef __cplusplus
}
Modified: harmony/enhanced/drlvm/trunk/vm/tests/unit/thread/test_java_basic.c
URL: http://svn.apache.org/viewvc/harmony/enhanced/drlvm/trunk/vm/tests/unit/thread/test_java_basic.c?view=diff&rev=510623&r1=510622&r2=510623
==============================================================================
--- harmony/enhanced/drlvm/trunk/vm/tests/unit/thread/test_java_basic.c (original)
+++ harmony/enhanced/drlvm/trunk/vm/tests/unit/thread/test_java_basic.c Thu Feb 22 10:53:49 2007
@@ -47,7 +47,7 @@
}
}
- status = vm_attach(GLOBAL_VM, &jni_env);
+ status = vm_attach(GLOBAL_VM, &jni_env, NULL);
if (status != JNI_OK) {
tts->phase = TT_PHASE_ERROR;
return 0;
Modified: harmony/enhanced/drlvm/trunk/vm/thread/src/thread_java_basic.c
URL: http://svn.apache.org/viewvc/harmony/enhanced/drlvm/trunk/vm/thread/src/thread_java_basic.c?view=diff&rev=510623&r1=510622&r2=510623
==============================================================================
--- harmony/enhanced/drlvm/trunk/vm/thread/src/thread_java_basic.c (original)
+++ harmony/enhanced/drlvm/trunk/vm/thread/src/thread_java_basic.c Thu Feb 22 10:53:49 2007
@@ -40,6 +40,7 @@
jvmtiEnv *tiEnv;
jvmtiStartFunction tiProc;
void *tiProcArgs;
+ void *vm_thread_dummies;
} wrapper_proc_data;
@@ -75,17 +76,22 @@
assert(jvmti_thread);
java_thread = jvmti_thread->thread_object;
- status = vm_attach(data->java_vm, &jni_env);
- if (status != JNI_OK) return TM_ERROR_INTERNAL;
+ status = vm_attach(data->java_vm, &jni_env, data->vm_thread_dummies);
+ assert (status == JNI_OK);
jvmti_thread->jenv = jni_env;
jvmti_thread->daemon = data->daemon;
TRACE(("TM: Java thread started: id=%d OS_handle=%p", native_thread->thread_id, apr_os_thread_current()));
+ if (!jvmti_thread->daemon) {
+ increase_nondaemon_threads_count(native_thread);
+ }
+
// Send Thread Start event.
jvmti_send_thread_start_end_event(1);
+
if (data->tiProc != NULL) {
data->tiProc(data->tiEnv, jni_env, data->tiProcArgs);
} else {
@@ -120,6 +126,8 @@
{
hythread_t tm_native_thread = NULL;
jvmti_thread_t tm_java_thread;
+ void *vm_thread_dummies;
+
wrapper_proc_data * data;
IDATA status;
@@ -145,20 +153,25 @@
if (data == NULL) {
return TM_ERROR_OUT_OF_MEMORY;
}
-
- // Prepare arguments for wrapper proc
+
+ // Get JavaVM
status = (*jni_env) -> GetJavaVM(jni_env, &data->java_vm);
if (status != JNI_OK) return TM_ERROR_INTERNAL;
+ // Allocate memory needed by soon to be born thread
+ vm_thread_dummies = vm_allocate_thread_dummies(data->java_vm);
+
+ if (vm_thread_dummies == NULL) {
+ return TM_ERROR_OUT_OF_MEMORY;
+ }
+
+ // prepare args for wrapper_proc
data->daemon = attrs->daemon;
data->tiEnv = attrs->jvmti_env;
data->tiProc = proc;
data->tiProcArgs = (void *)arg;
+ data->vm_thread_dummies = vm_thread_dummies;
- if (!data->daemon) {
- increase_nondaemon_threads_count(hythread_self());
- }
-
status = hythread_create(&tm_native_thread, (attrs->stacksize)?attrs->stacksize:1024000,
attrs->priority, 0, wrapper_proc, data);
Modified: harmony/enhanced/drlvm/trunk/vm/vmcore/include/thread_manager.h
URL: http://svn.apache.org/viewvc/harmony/enhanced/drlvm/trunk/vm/vmcore/include/thread_manager.h?view=diff&rev=510623&r1=510622&r2=510623
==============================================================================
--- harmony/enhanced/drlvm/trunk/vm/vmcore/include/thread_manager.h (original)
+++ harmony/enhanced/drlvm/trunk/vm/vmcore/include/thread_manager.h Thu Feb 22 10:53:49 2007
@@ -32,7 +32,7 @@
void free_this_thread_block(VM_thread *);
VM_thread * get_a_thread_block(JavaVM_Internal * java_vm);
-
+VM_thread * allocate_thread_block(JavaVM_Internal * java_vm);
extern volatile VM_thread *p_the_safepoint_control_thread; // only set when a gc is happening
extern volatile safepoint_state global_safepoint_status;
Modified: harmony/enhanced/drlvm/trunk/vm/vmcore/src/init/finalizer_thread.cpp
URL: http://svn.apache.org/viewvc/harmony/enhanced/drlvm/trunk/vm/vmcore/src/init/finalizer_thread.cpp?view=diff&rev=510623&r1=510622&r2=510623
==============================================================================
--- harmony/enhanced/drlvm/trunk/vm/vmcore/src/init/finalizer_thread.cpp (original)
+++ harmony/enhanced/drlvm/trunk/vm/vmcore/src/init/finalizer_thread.cpp Thu Feb 22 10:53:49 2007
@@ -151,7 +151,7 @@
JavaVM *java_vm = (JavaVM *)args[0];
JNIEnv *jni_env = (JNIEnv *)args[1];
- IDATA status = vm_attach(java_vm, &jni_env);
+ IDATA status = vm_attach(java_vm, &jni_env, NULL);
if(status != TM_ERROR_NONE)
return status;
Modified: harmony/enhanced/drlvm/trunk/vm/vmcore/src/init/ref_enqueue_thread.cpp
URL: http://svn.apache.org/viewvc/harmony/enhanced/drlvm/trunk/vm/vmcore/src/init/ref_enqueue_thread.cpp?view=diff&rev=510623&r1=510622&r2=510623
==============================================================================
--- harmony/enhanced/drlvm/trunk/vm/vmcore/src/init/ref_enqueue_thread.cpp (original)
+++ harmony/enhanced/drlvm/trunk/vm/vmcore/src/init/ref_enqueue_thread.cpp Thu Feb 22 10:53:49 2007
@@ -89,7 +89,7 @@
JavaVM *java_vm = (JavaVM *)args[0];
JNIEnv *jni_env = (JNIEnv *)args[1];
- IDATA status = vm_attach(java_vm, &jni_env);
+ IDATA status = vm_attach(java_vm, &jni_env, NULL);
if(status != TM_ERROR_NONE)
return status;
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=510623&r1=510622&r2=510623
==============================================================================
--- harmony/enhanced/drlvm/trunk/vm/vmcore/src/init/vm_init.cpp (original)
+++ harmony/enhanced/drlvm/trunk/vm/vmcore/src/init/vm_init.cpp Thu Feb 22 10:53:49 2007
@@ -592,7 +592,7 @@
}
assert(native_thread);
- status = vm_attach(java_vm, &jni_env);
+ status = vm_attach(java_vm, &jni_env, NULL);
if (status != JNI_OK) return status;
*p_jni_env = jni_env;
@@ -698,7 +698,7 @@
extern void initialize_signals();
initialize_signals();
- status = vm_attach(java_vm, &jni_env);
+ status = vm_attach(java_vm, &jni_env, NULL);
if (status != JNI_OK) return status;
finalizer_threads_init(java_vm, jni_env); /* added for NATIVE FINALIZER THREAD */
Modified: harmony/enhanced/drlvm/trunk/vm/vmcore/src/thread/thread_generic.cpp
URL: http://svn.apache.org/viewvc/harmony/enhanced/drlvm/trunk/vm/vmcore/src/thread/thread_generic.cpp?view=diff&rev=510623&r1=510622&r2=510623
==============================================================================
--- harmony/enhanced/drlvm/trunk/vm/vmcore/src/thread/thread_generic.cpp (original)
+++ harmony/enhanced/drlvm/trunk/vm/vmcore/src/thread/thread_generic.cpp Thu Feb 22 10:53:49 2007
@@ -91,6 +91,59 @@
extern struct JNINativeInterface_ jni_vtable;
+struct vmthread_dummies {
+ VM_thread *p_vm_thread;
+ ObjectHandles *p_object_handles;
+ M2nFrame *p_m2n_frame;
+};
+
+
+void *vm_allocate_thread_dummies(JavaVM *java_vm) {
+ struct vmthread_dummies *p_vmt_dummies;
+ VM_thread *vmt = allocate_thread_block((JavaVM_Internal *)java_vm);
+
+ if (vmt == NULL)
+ goto err;
+
+ p_vmt_dummies =
+ (struct vmthread_dummies *)apr_palloc(vmt->pool, sizeof(vmthread_dummies));
+
+ if (p_vmt_dummies == NULL)
+ goto err;
+
+ // Create top level M2N frame.
+ p_vmt_dummies->p_m2n_frame =
+ (M2nFrame*) apr_palloc(vmt->pool, sizeof(M2nFrame));
+ // Create local handles.
+ p_vmt_dummies->p_object_handles =
+ (ObjectHandles*) apr_palloc(vmt->pool, sizeof(ObjectHandlesNew));
+ // allocate jni env internal structures
+ vmt->jni_env = (JNIEnv_Internal *) apr_palloc(vmt->pool,
+ sizeof(JNIEnv_Internal));
+
+ if (vmt->jni_env == NULL || p_vmt_dummies->p_object_handles == NULL ||
+ p_vmt_dummies->p_m2n_frame == NULL)
+ goto err;
+
+ p_vmt_dummies->p_vm_thread = vmt;
+
+ return (void*)p_vmt_dummies;
+
+ err:
+ if (p_vmt_dummies->p_m2n_frame)
+ free (p_vmt_dummies->p_m2n_frame);
+ if (p_vmt_dummies->p_object_handles)
+ free(p_vmt_dummies->p_object_handles);
+ if (vmt->jni_env)
+ free(vmt->jni_env);
+ if (p_vmt_dummies)
+ free(p_vmt_dummies);
+ if (vmt)
+ free(vmt);
+
+ return NULL;
+}
+
/**
* Runs java.lang.Thread.detach() method.
*/
@@ -140,48 +193,64 @@
/**
* Attaches thread current thread to VM.
*/
-jint vm_attach(JavaVM * java_vm, JNIEnv ** p_jni_env) {
+jint vm_attach(JavaVM * java_vm, JNIEnv ** p_jni_env,
+ void *pv_vmt_dummies) {
M2nFrame * p_m2n;
VM_thread * p_vm_thread;
ObjectHandles * p_handles;
-
+ struct vmthread_dummies *p_vmt_dummies =
+ (struct vmthread_dummies *)pv_vmt_dummies;
+
+ if (p_vmt_dummies != NULL) {
+ p_m2n = p_vmt_dummies->p_m2n_frame;
+ p_vm_thread = p_vmt_dummies->p_vm_thread;
+ p_handles = p_vmt_dummies->p_object_handles;
+ }
+
// It seems to be reasonable to have suspend enabled state here.
// It is unsafe to perform operations which require suspend disabled
// mode until current thread is not attaced to VM.
assert(hythread_is_suspend_enabled());
- p_vm_thread = p_TLS_vmthread;
- if (p_vm_thread != NULL) {
- if (java_vm != p_vm_thread->jni_env->vm) {
- return TM_ERROR_INTERNAL;
- }
- *p_jni_env = p_vm_thread->jni_env;
- return JNI_OK;
- }
+ hythread_t hythread = hythread_self();
- p_vm_thread = get_a_thread_block((JavaVM_Internal *)java_vm);
- if (p_vm_thread == NULL) {
- TRACE2("thread", "can't get a thread block for a new thread");
- return JNI_ENOMEM;
+ if (p_vmt_dummies != NULL) {
+ // VMThread structure is already allocated, we only need to set
+ // TLS
+ set_TLS_data (p_vm_thread);
+ } else {
+ p_vm_thread = get_vm_thread(hythread);
+
+ if (p_vm_thread != NULL) {
+ assert (java_vm == p_vm_thread->jni_env->vm);
+ *p_jni_env = p_vm_thread->jni_env;
+ return JNI_OK;
+ }
+
+ p_vm_thread = get_a_thread_block((JavaVM_Internal *)java_vm);
}
+
+ // if the assertion is false we cannot notify the parent thread
+ // that we started and it would hang in waitloop
+ assert (p_vm_thread != NULL);
- // Create JNI environment for current thread.
- p_vm_thread->jni_env = (JNIEnv_Internal *) apr_palloc(p_vm_thread->pool, sizeof(JNIEnv_Internal));
-
+ if (p_vmt_dummies == NULL) {
+ // Create top level M2N frame.
+ p_m2n = (M2nFrame*) apr_palloc(p_vm_thread->pool, sizeof(M2nFrame));
+ // Create local handles.
+ p_handles = (ObjectHandles*) apr_palloc(p_vm_thread->pool, sizeof(ObjectHandlesNew));
+ p_vm_thread->jni_env = (JNIEnv_Internal *) apr_palloc(p_vm_thread->pool, sizeof(JNIEnv_Internal));
+ }
+
+ assert (p_m2n != NULL && p_handles != NULL && p_vm_thread->jni_env != NULL);
+
// Initialize JNI environment.
p_vm_thread->jni_env->functions = &jni_vtable;
p_vm_thread->jni_env->vm = (JavaVM_Internal *)java_vm;
p_vm_thread->jni_env->reserved0 = (void *)0x1234abcd;
*p_jni_env = p_vm_thread->jni_env;
-
- // Create top level M2N frame.
- p_m2n = (M2nFrame*) apr_palloc(p_vm_thread->pool, sizeof(M2nFrame));
- // Create local handles.
- p_handles = (ObjectHandles*) apr_palloc(p_vm_thread->pool, sizeof(ObjectHandlesNew));
- if (p_vm_thread->jni_env == NULL || p_m2n == NULL ||p_handles == NULL) {
- TRACE2("thread", "can't get a thread block for a new thread");
- return JNI_ENOMEM;
- }
+
+
init_stack_info();
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=510623&r1=510622&r2=510623
==============================================================================
--- harmony/enhanced/drlvm/trunk/vm/vmcore/src/thread/thread_manager.cpp (original)
+++ harmony/enhanced/drlvm/trunk/vm/vmcore/src/thread/thread_manager.cpp Thu Feb 22 10:53:49 2007
@@ -89,20 +89,34 @@
void init_TLS_data();
-VM_thread * get_a_thread_block(JavaVM_Internal * java_vm) {
+VM_thread * allocate_thread_block(JavaVM_Internal * java_vm) {
VM_thread * p_vmthread;
apr_pool_t * thread_pool;
+
+ if (apr_pool_create(&thread_pool, java_vm->vm_env->mem_pool) != APR_SUCCESS) {
+ return NULL;
+ }
+ p_vmthread = (VM_thread *) apr_pcalloc(thread_pool, sizeof(VM_thread));
+
+ if (!p_vmthread) return NULL;
+
+ p_vmthread->pool = thread_pool;
+
+ return p_vmthread;
+}
+
+
+
+VM_thread * get_a_thread_block(JavaVM_Internal * java_vm) {
+ VM_thread * p_vmthread;
p_vmthread = p_TLS_vmthread;
if (!p_vmthread) {
- if (apr_pool_create(&thread_pool, java_vm->vm_env->mem_pool) != APR_SUCCESS) {
- return NULL;
- }
- p_vmthread = (VM_thread *) apr_pcalloc(thread_pool, sizeof(VM_thread));
- if (!p_vmthread) return NULL;
+ p_vmthread = allocate_thread_block(java_vm);
+
+ if (!p_vmthread) return NULL;
+ set_TLS_data(p_vmthread);
- p_vmthread->pool = thread_pool;
- set_TLS_data(p_vmthread);
} else {
memset(p_vmthread, 0, sizeof(VM_thread));
}