Added parked/timed_parked states.
authorStefan Ring <stefan@complang.tuwien.ac.at>
Mon, 20 Oct 2008 18:17:22 +0000 (20:17 +0200)
committerStefan Ring <stefan@complang.tuwien.ac.at>
Mon, 20 Oct 2008 18:17:22 +0000 (20:17 +0200)
* src/native/vm/gnuclasspath/java_lang_VMThread.cpp
(Java_java_lang_VMThread_getState): Handle THREAD_STATE_PARKED,
THREAD_STATE_TIMED_PARKED.
* src/native/vm/openjdk/jvm.cpp (JVM_GetThreadStateValues,
JVM_GetThreadStateNames): Likewise.
* src/threads/thread.cpp (thread_print_info): Likewise.
(thread_set_state_parked, thread_set_state_timed_parked): Added.
* src/threads/thread.hpp (thread_set_state_parked,
thread_set_state_timed_parked): Added.
(THREAD_STATE_PARKED, THREAD_STATE_TIMED_PARKED): Added.
* src/threads/posix/thread-posix.cpp (threads_wait_with_timeout): Set parked
state.

--HG--
extra : transplant_source : %EFv%A1%BC%93J%C9%8Fi%18%EA57%7E%ADJQ%D9%FE%B1

src/native/vm/gnuclasspath/java_lang_VMThread.cpp
src/native/vm/openjdk/jvm.cpp
src/threads/posix/thread-posix.cpp
src/threads/thread.cpp
src/threads/thread.hpp

index da3eccb25488ba8f6f45dc8d81798a7ac3184940..6d8b88b1835a12b288906616bb21b9bdbbacb541 100644 (file)
@@ -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;
index 0ed70979bee69b493f0791f248c3a3269286ebe1..1fc609c1d168e991debbca348f2edbec4c4ec93e 100644 (file)
@@ -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);
 
index 949c1b59918df83aea78ccdf8531e0da4cc20eaa..9629b004ef99a50225ed4982ed3f64bde589fd04 100644 (file)
@@ -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);
 
index 6f83faf5b146b8afd2241359f0865ebd65808b1c..0cf22e757f0518046279f00842ff6e49b8f4a924 100644 (file)
@@ -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
index b50db4370728cc6ae88aae68d9d921a6781c9d97..c3563cf33ddb73d2f58624ba866071d149753f7c 100644 (file)
@@ -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);