#include INCLUDE_JVM_MD_H
#include INCLUDE_JVM_H
+#include "fdlibm/fdlibm.h"
+
#include "mm/memory.hpp"
#include "native/llni.h"
#include "threads/lock.hpp"
#include "threads/thread.hpp"
+#include "threads/threadlist.hpp"
#include "toolbox/logging.hpp"
#include "toolbox/list.hpp"
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;
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;
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)
/* 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;
/* 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;
}
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;
}
// 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);
}
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;
/* 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:
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: