From: Stefan Ring Date: Mon, 20 Oct 2008 19:08:14 +0000 (+0200) Subject: Merged. X-Git-Url: http://wien.tomnetworks.com/gitweb/?a=commitdiff_plain;h=3f7fc9ef4a2ffb2bf1db679a69999a60af0832b3;hp=91772343c6945ade4233038b49b57424b1e34b07;p=cacao.git Merged. --- diff --git a/src/native/vm/gnuclasspath/java_lang_VMThread.cpp b/src/native/vm/gnuclasspath/java_lang_VMThread.cpp index da3eccb25..6d8b88b18 100644 --- a/src/native/vm/gnuclasspath/java_lang_VMThread.cpp +++ b/src/native/vm/gnuclasspath/java_lang_VMThread.cpp @@ -298,6 +298,12 @@ JNIEXPORT jstring JNICALL Java_java_lang_VMThread_getState(JNIEnv *env, jobject case THREAD_STATE_TIMED_WAITING: u = utf_new_char("TIMED_WAITING"); break; + case THREAD_STATE_PARKED: + u = utf_new_char("PARKED"); + break; + case THREAD_STATE_TIMED_PARKED: + u = utf_new_char("TIMED_PARKED"); + break; case THREAD_STATE_TERMINATED: u = utf_new_char("TERMINATED"); break; diff --git a/src/native/vm/openjdk/jvm.cpp b/src/native/vm/openjdk/jvm.cpp index 7a63880ba..1bbdd3ea4 100644 --- a/src/native/vm/openjdk/jvm.cpp +++ b/src/native/vm/openjdk/jvm.cpp @@ -3358,6 +3358,24 @@ jintArray JVM_GetThreadStateValues(JNIEnv* env, jint javaThreadState) /* array_intarray_element_set(ia, 2, PARKED); */ break; + case THREAD_STATE_PARKED: + ia = builtin_newarray_int(2); + + if (ia == NULL) + return NULL; + + array_intarray_element_set(ia, 0, THREAD_STATE_PARKED); + break; + + case THREAD_STATE_TIMED_PARKED: + ia = builtin_newarray_int(2); + + if (ia == NULL) + return NULL; + + array_intarray_element_set(ia, 0, THREAD_STATE_TIMED_PARKED); + break; + case THREAD_STATE_TERMINATED: ia = builtin_newarray_int(1); @@ -3453,7 +3471,6 @@ jobjectArray JVM_GetThreadStateNames(JNIEnv* env, jint javaThreadState, jintArra return NULL; s = javastring_new(utf_new_char("WAITING.OBJECT_WAIT")); -/* s = javastring_new(utf_new_char("WAITING.PARKED")); */ if (s == NULL) return NULL; @@ -3470,7 +3487,6 @@ jobjectArray JVM_GetThreadStateNames(JNIEnv* env, jint javaThreadState, jintArra /* s = javastring_new(utf_new_char("TIMED_WAITING.SLEEPING")); */ s = javastring_new(utf_new_char("TIMED_WAITING.OBJECT_WAIT")); -/* s = javastring_new(utf_new_char("TIMED_WAITING.PARKED")); */ if (s == NULL) return NULL; @@ -3480,6 +3496,36 @@ jobjectArray JVM_GetThreadStateNames(JNIEnv* env, jint javaThreadState, jintArra /* array_objectarray_element_set(oa, 2, s); */ break; + case THREAD_STATE_PARKED: + oa = builtin_anewarray(2, class_java_lang_String); + + if (oa == NULL) + return NULL; + + s = javastring_new(utf_new_char("WAITING.PARKED")); + + if (s == NULL) + return NULL; + + array_objectarray_element_set(oa, 0, s); +/* array_objectarray_element_set(oa, 1, s); */ + break; + + case THREAD_STATE_TIMED_PARKED: + oa = builtin_anewarray(3, class_java_lang_String); + + if (oa == NULL) + return NULL; + + s = javastring_new(utf_new_char("TIMED_WAITING.PARKED")); + + if (s == NULL) + return NULL; + + array_objectarray_element_set(oa, 0, s); +/* array_objectarray_element_set(oa, 1, s); */ + break; + case THREAD_STATE_TERMINATED: oa = builtin_anewarray(1, class_java_lang_String); diff --git a/src/threads/posix/thread-posix.cpp b/src/threads/posix/thread-posix.cpp index 949c1b599..9629b004e 100644 --- a/src/threads/posix/thread-posix.cpp +++ b/src/threads/posix/thread-posix.cpp @@ -1381,7 +1381,10 @@ static void threads_wait_with_timeout(threadobject *t, struct timespec *wakeupTi while (!t->interrupted && !(parking ? t->park_permit : t->signaled) && threads_current_time_is_earlier_than(wakeupTime)) { - thread_set_state_timed_waiting(t); + if (parking) + thread_set_state_timed_parked(t); + else + thread_set_state_timed_waiting(t); t->waitcond->timedwait(t->waitmutex, wakeupTime); @@ -1391,7 +1394,10 @@ static void threads_wait_with_timeout(threadobject *t, struct timespec *wakeupTi else { /* no timeout */ while (!t->interrupted && !(parking ? t->park_permit : t->signaled)) { - thread_set_state_waiting(t); + if (parking) + thread_set_state_parked(t); + else + thread_set_state_waiting(t); t->waitcond->wait(t->waitmutex); diff --git a/src/threads/thread.cpp b/src/threads/thread.cpp index 8804f6eb5..57f8b5c0b 100644 --- a/src/threads/thread.cpp +++ b/src/threads/thread.cpp @@ -948,6 +948,12 @@ void thread_print_info(threadobject *t) case THREAD_STATE_TIMED_WAITING: printf(" waiting on condition"); break; + case THREAD_STATE_PARKED: + printf(" parked"); + break; + case THREAD_STATE_TIMED_PARKED: + printf(" timed parked"); + break; case THREAD_STATE_TERMINATED: printf(" terminated"); break; @@ -1057,6 +1063,56 @@ void thread_set_state_timed_waiting(threadobject *t) } +/* thread_set_state_parked ***************************************************** + + Set the current state of the given thread to THREAD_STATE_PARKED. + + NOTE: If the thread has already terminated, don't set the state. + This is important for threads_detach_thread. + +*******************************************************************************/ + +void thread_set_state_parked(threadobject *t) +{ + /* Set the state inside a lock. */ + + ThreadList::lock(); + + if (t->state != THREAD_STATE_TERMINATED) { + t->state = THREAD_STATE_PARKED; + + DEBUGTHREADS("is PARKED", t); + } + + ThreadList::unlock(); +} + + +/* thread_set_state_timed_parked *********************************************** + + Set the current state of the given thread to THREAD_STATE_TIMED_PARKED. + + NOTE: If the thread has already terminated, don't set the state. + This is important for threads_detach_thread. + +*******************************************************************************/ + +void thread_set_state_timed_parked(threadobject *t) +{ + /* Set the state inside a lock. */ + + ThreadList::lock(); + + if (t->state != THREAD_STATE_TERMINATED) { + t->state = THREAD_STATE_TIMED_PARKED; + + DEBUGTHREADS("is TIMED_PARKED", t); + } + + ThreadList::unlock(); +} + + /* thread_set_state_terminated ************************************************* Set the current state of the given thread to diff --git a/src/threads/thread.hpp b/src/threads/thread.hpp index b50db4370..c3563cf33 100644 --- a/src/threads/thread.hpp +++ b/src/threads/thread.hpp @@ -59,6 +59,8 @@ #define THREAD_STATE_WAITING 3 #define THREAD_STATE_TIMED_WAITING 4 #define THREAD_STATE_TERMINATED 5 +#define THREAD_STATE_PARKED 6 +#define THREAD_STATE_TIMED_PARKED 7 /* thread priorities **********************************************************/ @@ -326,6 +328,8 @@ intptr_t threads_get_current_tid(void); void thread_set_state_runnable(threadobject *t); void thread_set_state_waiting(threadobject *t); void thread_set_state_timed_waiting(threadobject *t); +void thread_set_state_parked(threadobject *t); +void thread_set_state_timed_parked(threadobject *t); void thread_set_state_terminated(threadobject *t); threadobject *thread_get_thread(java_handle_t *h);