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.hpp"
31 #include "native/llni.h"
32 #include "native/native.hpp"
34 #if defined(ENABLE_JNI_HEADERS)
35 # include "native/vm/include/java_lang_VMThread.h"
38 #include "threads/lock.hpp"
39 #include "threads/thread.hpp"
41 #include "vm/exceptions.hpp"
42 #include "vm/javaobjects.hpp"
43 #include "vm/string.hpp"
47 // Native functions are exported as C functions.
51 * Class: java/lang/VMThread
52 * Method: countStackFrames
55 JNIEXPORT jint JNICALL Java_java_lang_VMThread_countStackFrames(JNIEnv *env, jobject _this)
57 log_println("Java_java_lang_VMThread_countStackFrames: Deprecated. Not implemented.");
64 * Class: java/lang/VMThread
68 JNIEXPORT void JNICALL Java_java_lang_VMThread_start(JNIEnv *env, jobject _this, jlong stacksize)
70 #if defined(ENABLE_THREADS)
71 java_lang_VMThread jlvmt(_this);
73 threads_thread_start(jlvmt.get_thread());
79 * Class: java/lang/VMThread
83 JNIEXPORT void JNICALL Java_java_lang_VMThread_interrupt(JNIEnv *env, jobject _this)
85 #if defined(ENABLE_THREADS)
89 h = (java_handle_t *) _this;
90 t = thread_get_thread(h);
92 threads_thread_interrupt(t);
98 * Class: java/lang/VMThread
99 * Method: isInterrupted
102 JNIEXPORT jboolean JNICALL Java_java_lang_VMThread_isInterrupted(JNIEnv *env, jobject _this)
104 #if defined(ENABLE_THREADS)
108 h = (java_handle_t *) _this;
109 t = thread_get_thread(h);
111 return thread_is_interrupted(t);
119 * Class: java/lang/VMThread
123 JNIEXPORT void JNICALL Java_java_lang_VMThread_suspend(JNIEnv *env, jobject _this)
125 #if defined(ENABLE_THREADS)
126 log_println("Java_java_lang_VMThread_suspend: Deprecated. Not implemented.");
132 * Class: java/lang/VMThread
136 JNIEXPORT void JNICALL Java_java_lang_VMThread_resume(JNIEnv *env, jobject _this)
138 #if defined(ENABLE_THREADS)
139 log_println("Java_java_lang_VMThread_resume: Deprecated. Not implemented.");
145 * Class: java/lang/VMThread
146 * Method: nativeSetPriority
149 JNIEXPORT void JNICALL Java_java_lang_VMThread_nativeSetPriority(JNIEnv *env, jobject _this, jint priority)
151 #if defined(ENABLE_THREADS)
155 h = (java_handle_t *) _this;
156 t = thread_get_thread(h);
158 threads_set_thread_priority(t->tid, priority);
164 * Class: java/lang/VMThread
166 * Signature: (Ljava/lang/Throwable;)V
168 JNIEXPORT void JNICALL Java_java_lang_VMThread_nativeStop(JNIEnv *env, jobject _this, jobject t)
170 #if defined(ENABLE_THREADS)
171 log_println("Java_java_lang_VMThread_nativeStop: Deprecated. Not implemented.");
177 * Class: java/lang/VMThread
178 * Method: currentThread
179 * Signature: ()Ljava/lang/Thread;
181 JNIEXPORT jobject JNICALL Java_java_lang_VMThread_currentThread(JNIEnv *env, jclass clazz)
185 h = thread_get_current_object();
192 * Class: java/lang/VMThread
196 JNIEXPORT void JNICALL Java_java_lang_VMThread_yield(JNIEnv *env, jclass clazz)
198 #if defined(ENABLE_THREADS)
205 * Class: java/lang/VMThread
209 JNIEXPORT void JNICALL Java_java_lang_VMThread_sleep(JNIEnv *env, jclass clazz, int64_t ms, int32_t ns)
211 #if defined(ENABLE_THREADS)
212 threads_sleep(ms, ns);
218 * Class: java/lang/VMThread
219 * Method: interrupted
222 JNIEXPORT jboolean JNICALL Java_java_lang_VMThread_interrupted(JNIEnv *env, jclass clazz)
224 #if defined(ENABLE_THREADS)
228 t = thread_get_current();
230 interrupted = thread_is_interrupted(t);
233 thread_set_interrupted(t, false);
243 * Class: java/lang/VMThread
245 * Signature: (Ljava/lang/Object;)Z
247 JNIEXPORT jboolean JNICALL Java_java_lang_VMThread_holdsLock(JNIEnv *env, jclass clazz, jobject o)
249 #if defined(ENABLE_THREADS)
252 h = (java_handle_t *) o;
255 exceptions_throw_nullpointerexception();
259 return lock_is_held_by_current_thread(h);
267 * Class: java/lang/VMThread
269 * Signature: ()Ljava/lang/String;
271 JNIEXPORT jstring JNICALL Java_java_lang_VMThread_getState(JNIEnv *env, jobject _this)
273 #if defined(ENABLE_THREADS)
280 h = (java_handle_t *) _this;
281 t = thread_get_thread(h);
283 state = cacaothread_get_state(t);
286 case THREAD_STATE_NEW:
287 u = utf_new_char("NEW");
289 case THREAD_STATE_RUNNABLE:
290 u = utf_new_char("RUNNABLE");
292 case THREAD_STATE_BLOCKED:
293 u = utf_new_char("BLOCKED");
295 case THREAD_STATE_WAITING:
296 u = utf_new_char("WAITING");
298 case THREAD_STATE_TIMED_WAITING:
299 u = utf_new_char("TIMED_WAITING");
301 case THREAD_STATE_TERMINATED:
302 u = utf_new_char("TERMINATED");
305 vm_abort("Java_java_lang_VMThread_getState: unknown thread state %d", state);
307 /* Keep compiler happy. */
312 o = javastring_new(u);
323 /* native methods implemented by this file ************************************/
325 static JNINativeMethod methods[] = {
326 { (char*) "countStackFrames", (char*) "()I", (void*) (uintptr_t) &Java_java_lang_VMThread_countStackFrames },
327 { (char*) "start", (char*) "(J)V", (void*) (uintptr_t) &Java_java_lang_VMThread_start },
328 { (char*) "interrupt", (char*) "()V", (void*) (uintptr_t) &Java_java_lang_VMThread_interrupt },
329 { (char*) "isInterrupted", (char*) "()Z", (void*) (uintptr_t) &Java_java_lang_VMThread_isInterrupted },
330 { (char*) "suspend", (char*) "()V", (void*) (uintptr_t) &Java_java_lang_VMThread_suspend },
331 { (char*) "resume", (char*) "()V", (void*) (uintptr_t) &Java_java_lang_VMThread_resume },
332 { (char*) "nativeSetPriority", (char*) "(I)V", (void*) (uintptr_t) &Java_java_lang_VMThread_nativeSetPriority },
333 { (char*) "nativeStop", (char*) "(Ljava/lang/Throwable;)V", (void*) (uintptr_t) &Java_java_lang_VMThread_nativeStop },
334 { (char*) "currentThread", (char*) "()Ljava/lang/Thread;", (void*) (uintptr_t) &Java_java_lang_VMThread_currentThread },
335 { (char*) "yield", (char*) "()V", (void*) (uintptr_t) &Java_java_lang_VMThread_yield },
336 { (char*) "sleep", (char*) "(JI)V", (void*) (uintptr_t) &Java_java_lang_VMThread_sleep },
337 { (char*) "interrupted", (char*) "()Z", (void*) (uintptr_t) &Java_java_lang_VMThread_interrupted },
338 { (char*) "holdsLock", (char*) "(Ljava/lang/Object;)Z", (void*) (uintptr_t) &Java_java_lang_VMThread_holdsLock },
339 { (char*) "getState", (char*) "()Ljava/lang/String;", (void*) (uintptr_t) &Java_java_lang_VMThread_getState },
343 /* _Jv_java_lang_VMThread_init *************************************************
345 Register native functions.
347 *******************************************************************************/
351 void _Jv_java_lang_VMThread_init(void)
355 u = utf_new_char("java/lang/VMThread");
357 native_method_register(u, methods, NATIVE_METHODS_COUNT);
363 * These are local overrides for various environment variables in Emacs.
364 * Please do not remove this and leave it at the end of the file, where
365 * Emacs will automagically detect them.
366 * ---------------------------------------------------------------------
369 * indent-tabs-mode: t