* src/native/vm/openjdk/jvm.cpp (JVM_IsInterrupted): Fixed for threads which
[cacao.git] / src / native / vm / openjdk / jvm.cpp
index d9079edff03cf5f5266b6e2806217a30b0a9a3b7..cc431263185f5366f223875e3ac581068eef4c7a 100644 (file)
@@ -50,6 +50,8 @@
 #include INCLUDE_JVM_MD_H
 #include INCLUDE_JVM_H
 
+#include "fdlibm/fdlibm.h"
+
 #include "mm/memory.hpp"
 
 #include "native/llni.h"
@@ -62,6 +64,7 @@
 
 #include "threads/lock.hpp"
 #include "threads/thread.hpp"
+#include "threads/threadlist.hpp"
 
 #include "toolbox/logging.hpp"
 #include "toolbox/list.hpp"
@@ -2130,8 +2133,7 @@ jboolean JVM_IsThreadAlive(JNIEnv* env, jobject jthread)
        h = (java_handle_t *) jthread;
        t = thread_get_thread(h);
 
-       /* The threadobject is null when a thread is created in Java. The
-          priority is set later during startup. */
+       /* The threadobject is null when a thread is created in Java. */
 
        if (t == NULL)
                return 0;
@@ -2236,6 +2238,8 @@ void JVM_Interrupt(JNIEnv* env, jobject jthread)
        h = (java_handle_t *) jthread;
        t = thread_get_thread(h);
 
+       /* The threadobject is null when a thread is created in Java. */
+
        if (t == NULL)
                return;
 
@@ -2256,6 +2260,11 @@ jboolean JVM_IsInterrupted(JNIEnv* env, jobject jthread, jboolean clear_interrup
        h = (java_handle_t *) jthread;
        t = thread_get_thread(h);
 
+       /* The threadobject is null when a thread is created in Java. */
+
+       if (t == NULL)
+               return JNI_FALSE;
+
        interrupted = thread_is_interrupted(t);
 
        if (interrupted && clear_interrupted)
@@ -2595,14 +2604,26 @@ jobject JVM_NewMultiArray(JNIEnv *env, jclass eltClass, jintArray dim)
 
        /* Create an array-class if necessary. */
 
-       if (class_is_primitive(c))
+       if (class_is_primitive(c)) {
                ac = Primitive::get_arrayclass_by_name(c->name);
+
+               // Arrays of void are not allowed.
+               if (ac == NULL) {
+                       exceptions_throw_illegalargumentexception();
+                       return NULL;
+               }
+
+               if (length > 1)
+                       ac = class_multiarray_of((length - 1), ac, true);
+       }
        else
-               ac = class_array_of(c, true);
+               ac = class_multiarray_of(length, c, true);
 
        if (ac == NULL)
                return NULL;
 
+       /* Allocate a new array on the heap. */
+
        a = builtin_multianewarray(length, (java_handle_t *) ac, dims);
 
        return (jobject) a;
@@ -2893,11 +2914,17 @@ void *JVM_FindLibraryEntry(void* handle, const char* name)
 
 /* JVM_IsNaN */
 
-jboolean JVM_IsNaN(jdouble a)
+jboolean JVM_IsNaN(jdouble d)
 {
-       log_println("JVM_IsNaN: IMPLEMENT ME!");
+       bool result;
 
-       return 0;
+       TRACEJVMCALLSENTER(("JVM_IsNaN(d=%f)", d));
+
+       result = isnan(d);
+
+       TRACEJVMCALLSEXIT(("->%d", result));
+
+       return result;
 }
 
 
@@ -3172,9 +3199,31 @@ jboolean JVM_CX8Field(JNIEnv *env, jobject obj, jfieldID fid, jlong oldVal, jlon
 
 jobjectArray JVM_GetAllThreads(JNIEnv *env, jclass dummy)
 {
-       log_println("JVM_GetAllThreads: IMPLEMENT ME!");
+       // Get a list of all active threads.
+       list<threadobject*> active_threads;
+       ThreadList::get_active_threads(active_threads);
 
-       return NULL;
+       // Allocate array to hold the java.lang.Thread objects.
+       int32_t length = active_threads.size();
+       java_handle_objectarray_t* oa = builtin_anewarray(length, class_java_lang_Thread);
+
+       if (oa == NULL)
+               return NULL;
+
+       // Iterate over all threads (which were active just a second ago).
+       int32_t index = 0;
+       for (List<threadobject*>::iterator it = active_threads.begin(); it != active_threads.end(); it++) {
+               threadobject* t = *it;
+
+               java_handle_t* h = thread_get_object(t);
+               assert(h != NULL);
+
+               array_objectarray_element_set(oa, index, h);
+
+               index++;
+       }
+
+       return oa;
 }
 
 
@@ -3214,18 +3263,19 @@ jobjectArray JVM_DumpThreads(JNIEnv *env, jclass threadClass, jobjectArray threa
                // Get thread for the given thread object.
                threadobject* t = thread_get_thread(thread);
 
+               // The threadobject is null when a thread is created in Java.
                if (t == NULL)
                        continue;
 
                // Get stacktrace for given thread.
                stacktrace_t* st = stacktrace_get_of_thread(t);
 
-               if (st == NULL)
-                       continue;
-
                // Convert stacktrace into array of StackTraceElements.
                java_handle_objectarray_t* oa = stacktrace_get_StackTraceElements(st);
 
+               if (oa == NULL)
+                       return NULL;
+
                array_objectarray_element_set(oas, i, (java_handle_t*) oa);
        }
 
@@ -3337,12 +3387,11 @@ jintArray JVM_GetThreadStateValues(JNIEnv* env, jint javaThreadState)
                        return NULL;
 
                array_intarray_element_set(ia, 0, THREAD_STATE_WAITING);
-               /* XXX Implement parked stuff. */
-/*             array_intarray_element_set(ia, 1, PARKED); */
+               array_intarray_element_set(ia, 1, THREAD_STATE_PARKED);
                break; 
 
     case THREAD_STATE_TIMED_WAITING:
-               ia = builtin_newarray_int(3);
+               ia = builtin_newarray_int(2);
 
                if (ia == NULL)
                        return NULL;
@@ -3350,26 +3399,7 @@ jintArray JVM_GetThreadStateValues(JNIEnv* env, jint javaThreadState)
                /* XXX Not sure about that one. */
 /*             array_intarray_element_set(ia, 0, SLEEPING); */
                array_intarray_element_set(ia, 0, THREAD_STATE_TIMED_WAITING);
-               /* XXX Implement parked stuff. */
-/*             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);
+               array_intarray_element_set(ia, 1, THREAD_STATE_TIMED_PARKED);
                break; 
 
     case THREAD_STATE_TERMINATED:
@@ -3472,54 +3502,35 @@ jobjectArray JVM_GetThreadStateNames(JNIEnv* env, jint javaThreadState, jintArra
                        return NULL;
 
                array_objectarray_element_set(oa, 0, s);
-/*             array_objectarray_element_set(oa, 1, s); */
-               break; 
-
-    case THREAD_STATE_TIMED_WAITING:
-               oa = builtin_anewarray(3, class_java_lang_String);
 
-               if (oa == 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("WAITING.PARKED"));
 
                if (s == NULL)
                        return NULL;
 
-/*             array_objectarray_element_set(oa, 0, s); */
-               array_objectarray_element_set(oa, 0, s);
-/*             array_objectarray_element_set(oa, 2, s); */
+               array_objectarray_element_set(oa, 1, s);
                break; 
 
-    case THREAD_STATE_PARKED:
+    case THREAD_STATE_TIMED_WAITING:
                oa = builtin_anewarray(2, class_java_lang_String);
 
                if (oa == NULL)
                        return NULL;
 
-               s = javastring_new(utf_new_char("WAITING.PARKED"));
+/*             s = javastring_new(utf_new_char("TIMED_WAITING.SLEEPING")); */
+               s = javastring_new(utf_new_char("TIMED_WAITING.OBJECT_WAIT"));
 
                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); */
+               array_objectarray_element_set(oa, 1, s);
                break; 
 
     case THREAD_STATE_TERMINATED: