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
31 #include "native/jni.hpp"
32 #include "native/llni.h"
33 #include "native/native.hpp"
35 #if defined(ENABLE_JNI_HEADERS)
36 # include "native/vm/include/java_lang_VMThread.h"
39 #include "threads/lock.hpp"
40 #include "threads/thread.hpp"
42 #include "vm/exceptions.hpp"
43 #include "vm/javaobjects.hpp"
44 #include "vm/string.hpp"
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);
94 threads_thread_interrupt(t);
100 * Class: java/lang/VMThread
101 * Method: isInterrupted
104 JNIEXPORT jboolean JNICALL Java_java_lang_VMThread_isInterrupted(JNIEnv *env, jobject _this)
106 #if defined(ENABLE_THREADS)
110 h = (java_handle_t *) _this;
111 t = thread_get_thread(h);
114 return thread_is_interrupted(t);
122 * Class: java/lang/VMThread
126 JNIEXPORT void JNICALL Java_java_lang_VMThread_suspend(JNIEnv *env, jobject _this)
128 #if defined(ENABLE_THREADS)
129 log_println("Java_java_lang_VMThread_suspend: Deprecated. Not implemented.");
135 * Class: java/lang/VMThread
139 JNIEXPORT void JNICALL Java_java_lang_VMThread_resume(JNIEnv *env, jobject _this)
141 #if defined(ENABLE_THREADS)
142 log_println("Java_java_lang_VMThread_resume: Deprecated. Not implemented.");
148 * Class: java/lang/VMThread
149 * Method: nativeSetPriority
152 JNIEXPORT void JNICALL Java_java_lang_VMThread_nativeSetPriority(JNIEnv *env, jobject _this, jint priority)
154 #if defined(ENABLE_THREADS)
158 h = (java_handle_t *) _this;
159 t = thread_get_thread(h);
162 threads_set_thread_priority(t->tid, priority);
168 * Class: java/lang/VMThread
170 * Signature: (Ljava/lang/Throwable;)V
172 JNIEXPORT void JNICALL Java_java_lang_VMThread_nativeStop(JNIEnv *env, jobject _this, jobject t)
174 #if defined(ENABLE_THREADS)
175 log_println("Java_java_lang_VMThread_nativeStop: Deprecated. Not implemented.");
181 * Class: java/lang/VMThread
182 * Method: currentThread
183 * Signature: ()Ljava/lang/Thread;
185 JNIEXPORT jobject JNICALL Java_java_lang_VMThread_currentThread(JNIEnv *env, jclass clazz)
189 h = thread_get_current_object();
196 * Class: java/lang/VMThread
200 JNIEXPORT void JNICALL Java_java_lang_VMThread_yield(JNIEnv *env, jclass clazz)
202 #if defined(ENABLE_THREADS)
209 * Class: java/lang/VMThread
213 JNIEXPORT void JNICALL Java_java_lang_VMThread_sleep(JNIEnv *env, jclass clazz, int64_t ms, int32_t ns)
215 #if defined(ENABLE_THREADS)
216 threads_sleep(ms, ns);
222 * Class: java/lang/VMThread
223 * Method: interrupted
226 JNIEXPORT jboolean JNICALL Java_java_lang_VMThread_interrupted(JNIEnv *env, jclass clazz)
228 #if defined(ENABLE_THREADS)
232 t = thread_get_current();
234 interrupted = thread_is_interrupted(t);
237 thread_set_interrupted(t, false);
247 * Class: java/lang/VMThread
249 * Signature: (Ljava/lang/Object;)Z
251 JNIEXPORT jboolean JNICALL Java_java_lang_VMThread_holdsLock(JNIEnv *env, jclass clazz, jobject o)
253 #if defined(ENABLE_THREADS)
256 h = (java_handle_t *) o;
259 exceptions_throw_nullpointerexception();
263 return lock_is_held_by_current_thread(h);
271 * Class: java/lang/VMThread
273 * Signature: ()Ljava/lang/String;
275 JNIEXPORT jstring JNICALL Java_java_lang_VMThread_getState(JNIEnv *env, jobject _this)
277 #if defined(ENABLE_THREADS)
284 h = (java_handle_t *) _this;
285 t = thread_get_thread(h);
288 state = cacaothread_get_state(t);
291 case THREAD_STATE_NEW:
292 u = utf_new_char("NEW");
294 case THREAD_STATE_RUNNABLE:
295 u = utf_new_char("RUNNABLE");
297 case THREAD_STATE_BLOCKED:
298 u = utf_new_char("BLOCKED");
300 case THREAD_STATE_WAITING:
301 u = utf_new_char("WAITING");
303 case THREAD_STATE_TIMED_WAITING:
304 u = utf_new_char("TIMED_WAITING");
306 case THREAD_STATE_PARKED:
307 u = utf_new_char("PARKED");
309 case THREAD_STATE_TIMED_PARKED:
310 u = utf_new_char("TIMED_PARKED");
312 case THREAD_STATE_TERMINATED:
313 u = utf_new_char("TERMINATED");
316 vm_abort("Java_java_lang_VMThread_getState: unknown thread state %d", state);
318 /* Keep compiler happy. */
323 o = javastring_new(u);
334 /* native methods implemented by this file ************************************/
336 static JNINativeMethod methods[] = {
337 { (char*) "countStackFrames", (char*) "()I", (void*) (uintptr_t) &Java_java_lang_VMThread_countStackFrames },
338 { (char*) "start", (char*) "(J)V", (void*) (uintptr_t) &Java_java_lang_VMThread_start },
339 { (char*) "interrupt", (char*) "()V", (void*) (uintptr_t) &Java_java_lang_VMThread_interrupt },
340 { (char*) "isInterrupted", (char*) "()Z", (void*) (uintptr_t) &Java_java_lang_VMThread_isInterrupted },
341 { (char*) "suspend", (char*) "()V", (void*) (uintptr_t) &Java_java_lang_VMThread_suspend },
342 { (char*) "resume", (char*) "()V", (void*) (uintptr_t) &Java_java_lang_VMThread_resume },
343 { (char*) "nativeSetPriority", (char*) "(I)V", (void*) (uintptr_t) &Java_java_lang_VMThread_nativeSetPriority },
344 { (char*) "nativeStop", (char*) "(Ljava/lang/Throwable;)V", (void*) (uintptr_t) &Java_java_lang_VMThread_nativeStop },
345 { (char*) "currentThread", (char*) "()Ljava/lang/Thread;", (void*) (uintptr_t) &Java_java_lang_VMThread_currentThread },
346 { (char*) "yield", (char*) "()V", (void*) (uintptr_t) &Java_java_lang_VMThread_yield },
347 { (char*) "sleep", (char*) "(JI)V", (void*) (uintptr_t) &Java_java_lang_VMThread_sleep },
348 { (char*) "interrupted", (char*) "()Z", (void*) (uintptr_t) &Java_java_lang_VMThread_interrupted },
349 { (char*) "holdsLock", (char*) "(Ljava/lang/Object;)Z", (void*) (uintptr_t) &Java_java_lang_VMThread_holdsLock },
350 { (char*) "getState", (char*) "()Ljava/lang/String;", (void*) (uintptr_t) &Java_java_lang_VMThread_getState },
354 /* _Jv_java_lang_VMThread_init *************************************************
356 Register native functions.
358 *******************************************************************************/
360 void _Jv_java_lang_VMThread_init(void)
362 utf* u = utf_new_char("java/lang/VMThread");
364 NativeMethods& nm = VM::get_current()->get_nativemethods();
365 nm.register_methods(u, methods, NATIVE_METHODS_COUNT);
370 * These are local overrides for various environment variables in Emacs.
371 * Please do not remove this and leave it at the end of the file, where
372 * Emacs will automagically detect them.
373 * ---------------------------------------------------------------------
376 * indent-tabs-mode: t