1 /* src/native/vm/gnuclasspath/java_lang_VMThread.cpp
3 Copyright (C) 1996-2005, 2006, 2007, 2008
4 CACAOVM - Verein zur Foerderung der freien virtuellen Maschine CACAO
6 This file is part of CACAO.
8 This program is free software; you can redistribute it and/or
9 modify it under the terms of the GNU General Public License as
10 published by the Free Software Foundation; either version 2, or (at
11 your option) any later version.
13 This program is distributed in the hope that it will be useful, but
14 WITHOUT ANY WARRANTY; without even the implied warranty of
15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
16 General Public License for more details.
18 You should have received a copy of the GNU General Public License
19 along with this program; if not, write to the Free Software
20 Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
30 #include "native/jni.h"
31 #include "native/llni.h"
32 #include "native/native.h"
34 #if defined(ENABLE_JNI_HEADERS)
35 # include "native/vm/include/java_lang_VMThread.h"
38 #include "threads/lock-common.h"
39 #include "threads/thread.hpp"
41 #include "vm/exceptions.hpp"
42 #include "vm/string.hpp"
44 #include "vmcore/javaobjects.hpp"
45 #include "vmcore/utf8.h"
48 // Native functions are exported as C functions.
52 * Class: java/lang/VMThread
53 * Method: countStackFrames
56 JNIEXPORT jint JNICALL Java_java_lang_VMThread_countStackFrames(JNIEnv *env, jobject _this)
58 log_println("Java_java_lang_VMThread_countStackFrames: Deprecated. Not implemented.");
65 * Class: java/lang/VMThread
69 JNIEXPORT void JNICALL Java_java_lang_VMThread_start(JNIEnv *env, jobject _this, jlong stacksize)
71 #if defined(ENABLE_THREADS)
72 java_lang_VMThread jlvmt(_this);
74 threads_thread_start(jlvmt.get_thread());
80 * Class: java/lang/VMThread
84 JNIEXPORT void JNICALL Java_java_lang_VMThread_interrupt(JNIEnv *env, jobject _this)
86 #if defined(ENABLE_THREADS)
90 h = (java_handle_t *) _this;
91 t = thread_get_thread(h);
93 threads_thread_interrupt(t);
99 * Class: java/lang/VMThread
100 * Method: isInterrupted
103 JNIEXPORT jboolean JNICALL Java_java_lang_VMThread_isInterrupted(JNIEnv *env, jobject _this)
105 #if defined(ENABLE_THREADS)
109 h = (java_handle_t *) _this;
110 t = thread_get_thread(h);
112 return thread_is_interrupted(t);
120 * Class: java/lang/VMThread
124 JNIEXPORT void JNICALL Java_java_lang_VMThread_suspend(JNIEnv *env, jobject _this)
126 #if defined(ENABLE_THREADS)
127 log_println("Java_java_lang_VMThread_suspend: Deprecated. Not implemented.");
133 * Class: java/lang/VMThread
137 JNIEXPORT void JNICALL Java_java_lang_VMThread_resume(JNIEnv *env, jobject _this)
139 #if defined(ENABLE_THREADS)
140 log_println("Java_java_lang_VMThread_resume: Deprecated. Not implemented.");
146 * Class: java/lang/VMThread
147 * Method: nativeSetPriority
150 JNIEXPORT void JNICALL Java_java_lang_VMThread_nativeSetPriority(JNIEnv *env, jobject _this, jint priority)
152 #if defined(ENABLE_THREADS)
156 h = (java_handle_t *) _this;
157 t = thread_get_thread(h);
159 threads_set_thread_priority(t->tid, priority);
165 * Class: java/lang/VMThread
167 * Signature: (Ljava/lang/Throwable;)V
169 JNIEXPORT void JNICALL Java_java_lang_VMThread_nativeStop(JNIEnv *env, jobject _this, jobject t)
171 #if defined(ENABLE_THREADS)
172 log_println("Java_java_lang_VMThread_nativeStop: Deprecated. Not implemented.");
178 * Class: java/lang/VMThread
179 * Method: currentThread
180 * Signature: ()Ljava/lang/Thread;
182 JNIEXPORT jobject JNICALL Java_java_lang_VMThread_currentThread(JNIEnv *env, jclass clazz)
186 h = thread_get_current_object();
193 * Class: java/lang/VMThread
197 JNIEXPORT void JNICALL Java_java_lang_VMThread_yield(JNIEnv *env, jclass clazz)
199 #if defined(ENABLE_THREADS)
206 * Class: java/lang/VMThread
210 JNIEXPORT void JNICALL Java_java_lang_VMThread_sleep(JNIEnv *env, jclass clazz, int64_t ms, int32_t ns)
212 #if defined(ENABLE_THREADS)
213 threads_sleep(ms, ns);
219 * Class: java/lang/VMThread
220 * Method: interrupted
223 JNIEXPORT jboolean JNICALL Java_java_lang_VMThread_interrupted(JNIEnv *env, jclass clazz)
225 #if defined(ENABLE_THREADS)
229 t = thread_get_current();
231 interrupted = thread_is_interrupted(t);
234 thread_set_interrupted(t, false);
244 * Class: java/lang/VMThread
246 * Signature: (Ljava/lang/Object;)Z
248 JNIEXPORT jboolean JNICALL Java_java_lang_VMThread_holdsLock(JNIEnv *env, jclass clazz, jobject o)
250 #if defined(ENABLE_THREADS)
253 h = (java_handle_t *) o;
256 exceptions_throw_nullpointerexception();
260 return lock_is_held_by_current_thread(h);
268 * Class: java/lang/VMThread
270 * Signature: ()Ljava/lang/String;
272 JNIEXPORT jstring JNICALL Java_java_lang_VMThread_getState(JNIEnv *env, jobject _this)
274 #if defined(ENABLE_THREADS)
281 h = (java_handle_t *) _this;
282 t = thread_get_thread(h);
284 state = cacaothread_get_state(t);
287 case THREAD_STATE_NEW:
288 u = utf_new_char("NEW");
290 case THREAD_STATE_RUNNABLE:
291 u = utf_new_char("RUNNABLE");
293 case THREAD_STATE_BLOCKED:
294 u = utf_new_char("BLOCKED");
296 case THREAD_STATE_WAITING:
297 u = utf_new_char("WAITING");
299 case THREAD_STATE_TIMED_WAITING:
300 u = utf_new_char("TIMED_WAITING");
302 case THREAD_STATE_TERMINATED:
303 u = utf_new_char("TERMINATED");
306 vm_abort("Java_java_lang_VMThread_getState: unknown thread state %d", state);
308 /* Keep compiler happy. */
313 o = javastring_new(u);
324 /* native methods implemented by this file ************************************/
326 static JNINativeMethod methods[] = {
327 { (char*) "countStackFrames", (char*) "()I", (void*) (uintptr_t) &Java_java_lang_VMThread_countStackFrames },
328 { (char*) "start", (char*) "(J)V", (void*) (uintptr_t) &Java_java_lang_VMThread_start },
329 { (char*) "interrupt", (char*) "()V", (void*) (uintptr_t) &Java_java_lang_VMThread_interrupt },
330 { (char*) "isInterrupted", (char*) "()Z", (void*) (uintptr_t) &Java_java_lang_VMThread_isInterrupted },
331 { (char*) "suspend", (char*) "()V", (void*) (uintptr_t) &Java_java_lang_VMThread_suspend },
332 { (char*) "resume", (char*) "()V", (void*) (uintptr_t) &Java_java_lang_VMThread_resume },
333 { (char*) "nativeSetPriority", (char*) "(I)V", (void*) (uintptr_t) &Java_java_lang_VMThread_nativeSetPriority },
334 { (char*) "nativeStop", (char*) "(Ljava/lang/Throwable;)V", (void*) (uintptr_t) &Java_java_lang_VMThread_nativeStop },
335 { (char*) "currentThread", (char*) "()Ljava/lang/Thread;", (void*) (uintptr_t) &Java_java_lang_VMThread_currentThread },
336 { (char*) "yield", (char*) "()V", (void*) (uintptr_t) &Java_java_lang_VMThread_yield },
337 { (char*) "sleep", (char*) "(JI)V", (void*) (uintptr_t) &Java_java_lang_VMThread_sleep },
338 { (char*) "interrupted", (char*) "()Z", (void*) (uintptr_t) &Java_java_lang_VMThread_interrupted },
339 { (char*) "holdsLock", (char*) "(Ljava/lang/Object;)Z", (void*) (uintptr_t) &Java_java_lang_VMThread_holdsLock },
340 { (char*) "getState", (char*) "()Ljava/lang/String;", (void*) (uintptr_t) &Java_java_lang_VMThread_getState },
344 /* _Jv_java_lang_VMThread_init *************************************************
346 Register native functions.
348 *******************************************************************************/
352 void _Jv_java_lang_VMThread_init(void)
356 u = utf_new_char("java/lang/VMThread");
358 native_method_register(u, methods, NATIVE_METHODS_COUNT);
364 * These are local overrides for various environment variables in Emacs.
365 * Please do not remove this and leave it at the end of the file, where
366 * Emacs will automagically detect them.
367 * ---------------------------------------------------------------------
370 * indent-tabs-mode: t