diff --git a/vm/thread/src/thread_java_iterator.c b/vm/thread/src/thread_java_iterator.c index dacb9b9..ec616f6 100644 --- a/vm/thread/src/thread_java_iterator.c +++ b/vm/thread/src/thread_java_iterator.c @@ -62,18 +62,21 @@ IDATA VMCALL jthread_iterator_reset(jthr * @param[in] it iterator */ jthread VMCALL jthread_iterator_next(jthread_iterator_t *it) { - hythread_t tm_native_thread; - jvmti_thread_t tm_java_thread; - tm_native_thread = hythread_iterator_next((hythread_iterator_t *)it); - while(tm_native_thread!=NULL) - { + hythread_t tm_native_thread; + jvmti_thread_t tm_java_thread; + tm_native_thread = hythread_iterator_next((hythread_iterator_t *)it); + while(tm_native_thread!=NULL) + { + if (hythread_is_alive(tm_native_thread)) { tm_java_thread = hythread_get_private_data(tm_native_thread); - if (tm_java_thread){ - return (jthread)tm_java_thread->thread_object; - } - tm_native_thread = hythread_iterator_next((hythread_iterator_t *)it); + if (tm_java_thread){ + return (jthread)tm_java_thread->thread_object; + } } - return NULL; + tm_native_thread = hythread_iterator_next((hythread_iterator_t *)it); + } + + return NULL; } /** @@ -89,8 +92,8 @@ IDATA VMCALL jthread_iterator_size(jthre assert (status == TM_ERROR_NONE); res = jthread_iterator_next(&iterator); while(res!=NULL){ - count++; - res = jthread_iterator_next(&iterator); + count++; + res = jthread_iterator_next(&iterator); } status=jthread_iterator_reset(&iterator); assert (status == TM_ERROR_NONE); diff --git a/vm/thread/src/thread_native_basic.c b/vm/thread/src/thread_native_basic.c index 9d2e591..b08f3bc 100644 --- a/vm/thread/src/thread_native_basic.c +++ b/vm/thread/src/thread_native_basic.c @@ -187,7 +187,7 @@ IDATA VMCALL hythread_attach_to_group(hy thread->os_handle = os_handle; thread_set_self(thread); - thread->state = TM_THREAD_STATE_ALIVE; + thread->state = TM_THREAD_STATE_ALIVE | TM_THREAD_STATE_RUNNABLE; assert(thread == tm_self_tls); TRACE(("TM: native attached: native: %p ", tm_self_tls)); @@ -716,7 +716,6 @@ static void* APR_THREAD_FUNC thread_star thread_set_self(NULL); status = hythread_global_unlock(NULL); assert (status == TM_ERROR_NONE); - return (void *)(IDATA)apr_thread_exit(thd, APR_SUCCESS); } diff --git a/vm/vmcore/src/jvmti/jvmti_thread.cpp b/vm/vmcore/src/jvmti/jvmti_thread.cpp index 3bcbc9e..109ed6c 100644 --- a/vm/vmcore/src/jvmti/jvmti_thread.cpp +++ b/vm/vmcore/src/jvmti/jvmti_thread.cpp @@ -67,10 +67,11 @@ jvmtiGetThreadState(jvmtiEnv* env, if (NULL != thread) { - if (!is_valid_thread_object(thread)) + if (!is_valid_thread_object(thread)) { return JVMTI_ERROR_INVALID_THREAD; + } } - else + else thread = jthread_self(); if (thread_state_ptr == NULL){ @@ -123,7 +124,8 @@ jvmtiGetAllThreads(jvmtiEnv* env, //allocate memory err=jvmtiAllocate(env,java_thread_count*sizeof(jthread),(unsigned char**)&java_threads); if (err != JVMTI_ERROR_NONE){ - return err; + jthread_iterator_release(&iterator); + return err; } for (i=0;ijava_lang_Thread_Class); jobjectArray jt = jvmti_test_jenv -> NewObjectArray(10, cll, 0); - id = jvmti_test_jenv -> GetMethodID(cl, "enumerate","([Ljava/lang/Thread;)I"); - cc = jvmti_test_jenv -> CallIntMethod (group, id, jt); + id = jvmti_test_jenv -> GetMethodID(cl, "enumerate","([Ljava/lang/Thread;Z)I"); + cc = jvmti_test_jenv -> CallIntMethod (group, id, jt, JNI_FALSE); jthread * threads = NULL; jvmti_error = _allocate(sizeof(jthread) * cc, (unsigned char **)&threads);