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;
/* 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);
return NULL;
s = javastring_new(utf_new_char("WAITING.OBJECT_WAIT"));
-/* s = javastring_new(utf_new_char("WAITING.PARKED")); */
if (s == NULL)
return NULL;
/* 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;
/* 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);
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);
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);
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;
}
+/* 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
#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 **********************************************************/
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);