1 /* nat/Thread.c - java/lang/Thread
3 Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003
4 R. Grafl, A. Krall, C. Kruegel, C. Oates, R. Obermaisser,
5 M. Probst, S. Ring, E. Steiner, C. Thalinger, D. Thuernbeck,
6 P. Tomsich, J. Wenninger
8 This file is part of CACAO.
10 This program is free software; you can redistribute it and/or
11 modify it under the terms of the GNU General Public License as
12 published by the Free Software Foundation; either version 2, or (at
13 your option) any later version.
15 This program is distributed in the hope that it will be useful, but
16 WITHOUT ANY WARRANTY; without even the implied warranty of
17 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
18 General Public License for more details.
20 You should have received a copy of the GNU General Public License
21 along with this program; if not, write to the Free Software
22 Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
25 Contact: cacao@complang.tuwien.ac.at
27 Authors: Roman Obermaiser
29 Changes: Joseph Wenninger
31 $Id: VMThread.c 1227 2004-06-30 19:29:35Z twisti $
43 #include "threads/thread.h"
44 #include "toolbox/logging.h"
45 #include "java_lang_ThreadGroup.h"
46 #include "java_lang_Object.h" /* needed for java_lang_Thread.h */
47 #include "java_lang_Throwable.h" /* needed for java_lang_Thread.h */
48 #include "java_lang_VMThread.h"
49 #include "java_lang_Thread.h"
53 * Class: java/lang/Thread
54 * Method: countStackFrames
57 JNIEXPORT s4 JNICALL Java_java_lang_VMThread_countStackFrames(JNIEnv *env, java_lang_VMThread *this)
59 log_text("java_lang_VMThread_countStackFrames called");
65 * Class: java/lang/Thread
66 * Method: currentThread
67 * Signature: ()Ljava/lang/Thread;
69 JNIEXPORT java_lang_Thread* JNICALL Java_java_lang_VMThread_currentThread(JNIEnv *env, jclass clazz)
74 log_text("java_lang_VMThread_currentThread called");
76 #if defined(USE_THREADS)
77 #if !defined(NATIVE_THREADS)
78 t = (java_lang_Thread *) currentThread;
84 log_text("java_lang_VMThread_currentThread: t->group=NULL");
85 /* ThreadGroup of currentThread is not initialized */
87 t->group = (java_lang_ThreadGroup *)
88 native_new_and_init(class_new(utf_new_char("java/lang/ThreadGroup")));
91 log_text("unable to create ThreadGroup");
94 return (java_lang_Thread *) t;
102 * Class: java/lang/Thread
103 * Method: nativeInterrupt
106 JNIEXPORT void JNICALL Java_java_lang_VMThread_interrupt(JNIEnv *env, java_lang_VMThread *this)
108 log_text("Java_java_lang_VMThread_interrupt0 called");
113 * Class: java/lang/Thread
117 JNIEXPORT s4 JNICALL Java_java_lang_VMThread_isAlive(JNIEnv *env, java_lang_VMThread *this)
120 log_text("java_lang_VMThread_isAlive called");
122 #if defined(USE_THREADS)
123 return aliveThread((thread *) this->thread);
130 * Class: java_lang_Thread
131 * Method: isInterrupted
134 JNIEXPORT s4 JNICALL Java_java_lang_VMThread_isInterrupted(JNIEnv *env, java_lang_VMThread *this)
136 log_text("Java_java_lang_VMThread_isInterrupted called");
142 * Class: java/lang/Thread
143 * Method: registerNatives
146 JNIEXPORT void JNICALL Java_java_lang_VMThread_registerNatives(JNIEnv *env, jclass clazz)
153 * Class: java/lang/Thread
157 JNIEXPORT void JNICALL Java_java_lang_VMThread_resume(JNIEnv *env, java_lang_VMThread *this)
160 log_text("java_lang_VMThread_resume0 called");
162 #if defined(USE_THREADS) && !defined(NATIVE_THREADS)
163 resumeThread((thread *) this->thread);
169 * Class: java/lang/Thread
170 * Method: setPriority0
173 JNIEXPORT void JNICALL Java_java_lang_VMThread_nativeSetPriority(JNIEnv *env, java_lang_VMThread *this, s4 par1)
176 log_text("java_lang_VMThread_setPriority0 called");
178 #if defined(USE_THREADS) && !defined(NATIVE_THREADS)
179 setPriorityThread((thread *) this->thread, par1);
185 * Class: java_lang_Thread
189 JNIEXPORT void JNICALL Java_java_lang_VMThread_sleep(JNIEnv *env, jclass clazz, s8 millis, s4 nanos)
193 new_exception_message(string_java_lang_IllegalArgumentException,
194 "timeout value is negative");
199 if (nanos < 0 || nanos > 999999) {
201 new_exception_message(string_java_lang_IllegalArgumentException,
202 "nanosecond timeout value out of range");
207 #if defined(USE_THREADS)
208 sleepThread(millis, nanos);
214 * Class: java/lang/Thread
218 JNIEXPORT void JNICALL Java_java_lang_VMThread_start(JNIEnv *env, java_lang_VMThread *this, s8 par1)
221 log_text("java_lang_VMThread_start called");
223 #if defined(USE_THREADS)
224 #if defined(__GNUC__)
225 #warning perhaps it would be better to always work with the vmthread structure in the thread code (jowenn)
227 if (this->thread->vmThread == 0)
228 this->thread->vmThread = this;
230 startThread((thread *) (this->thread));
236 * Class: java/lang/Thread
238 * Signature: (Ljava/lang/Object;)V
240 JNIEXPORT void JNICALL Java_java_lang_VMThread_nativeStop(JNIEnv *env, java_lang_VMThread *this, java_lang_Throwable *par1)
243 log_text ("java_lang_VMThread_stop0 called");
246 #if defined(USE_THREADS) && !defined(NATIVE_THREADS)
247 if (currentThread == (thread*)this->thread) {
251 exceptionptr = proto_java_lang_ThreadDeath;
256 /*CONTEXT((thread*)this)*/ this->flags |= THREAD_FLAGS_KILLED;
257 resumeThread((thread*)this->thread);
264 * Class: java/lang/Thread
268 JNIEXPORT void JNICALL Java_java_lang_VMThread_suspend(JNIEnv *env, java_lang_VMThread *this)
271 log_text("java_lang_VMThread_suspend0 called");
273 #if defined(USE_THREADS) && !defined(NATIVE_THREADS)
274 suspendThread((thread*)this->thread);
280 * Class: java/lang/Thread
284 JNIEXPORT void JNICALL Java_java_lang_VMThread_yield(JNIEnv *env, jclass clazz)
287 log_text("java_lang_VMThread_yield called");
289 #if defined(USE_THREADS)
296 * Class: java_lang_Thread
297 * Method: interrupted
300 JNIEXPORT s4 JNICALL Java_java_lang_VMThread_interrupted(JNIEnv *env, jclass clazz)
302 log_text("Java_java_lang_VMThread_interrupted");
309 * Class: java_lang_Thread
313 JNIEXPORT void JNICALL Java_java_lang_VMThread_nativeInit(JNIEnv *env, java_lang_VMThread *this, s8 par1)
317 log_text("There has been an exception, strange...");*/
319 #if defined(USE_THREADS) && defined(NATIVE_THREADS)
320 initThread(this->thread);
322 this->thread->priority = 5;
327 * Class: java_lang_Thread
329 * Signature: (Ljava/lang/Object;)Z
331 JNIEXPORT s4 JNICALL Java_java_lang_VMThread_holdsLock(JNIEnv *env, jclass clazz, java_lang_Object *par1)
338 * These are local overrides for various environment variables in Emacs.
339 * Please do not remove this and leave it at the end of the file, where
340 * Emacs will automagically detect them.
341 * ---------------------------------------------------------------------
344 * indent-tabs-mode: t