-#ifndef _NATIVETHREAD_H
-#define _NATIVETHREAD_H
+/* src/threads/native/threads.h - native threads header
-#include "jni.h"
-#include "nat/java_lang_Object.h"
-#include "nat/java_lang_Throwable.h"
-#include "nat/java_lang_Thread.h"
+ Copyright (C) 1996-2005, 2006, 2007 R. Grafl, A. Krall, C. Kruegel,
+ C. Oates, R. Obermaisser, M. Platter, M. Probst, S. Ring,
+ E. Steiner, C. Thalinger, D. Thuernbeck, P. Tomsich, C. Ullrich,
+ J. Wenninger, Institut f. Computersprachen - TU Wien
-struct _threadobject;
+ This file is part of CACAO.
-typedef struct monitorLockRecord {
- struct _threadobject *owner;
- int lockCount;
- long storedBits;
- struct monitorLockRecord *queue;
- struct monitorLockRecord *nextFree;
-} monitorLockRecord;
+ This program is free software; you can redistribute it and/or
+ modify it under the terms of the GNU General Public License as
+ published by the Free Software Foundation; either version 2, or (at
+ your option) any later version.
-struct _lockRecordPool;
+ This program is distributed in the hope that it will be useful, but
+ WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ General Public License for more details.
-typedef struct {
- struct _lockRecordPool *next;
- int size;
-} lockRecordPoolHeader;
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+ 02110-1301, USA.
-typedef struct _lockRecordPool {
- lockRecordPoolHeader header;
- monitorLockRecord lr[1];
-} lockRecordPool;
+*/
-#define INITIALLOCKRECORDS 8
-/* Monitor lock implementation */
-typedef struct {
- pthread_mutex_t metaLockMutex;
- pthread_cond_t metaLockCond;
- bool gotMetaLockSlow;
- bool bitsForGrab;
- long metaLockBits;
- struct _threadobject *succ;
- pthread_mutex_t monitorLockMutex;
- pthread_cond_t monitorLockCond;
- bool isWaitingForNotify;
-
- monitorLockRecord *firstLR;
- monitorLockRecord lr[INITIALLOCKRECORDS];
- lockRecordPool *lrpool;
-} ExecEnvironment;
+#ifndef _THREADS_H
+#define _THREADS_H
+
+/* forward typedefs ***********************************************************/
+
+typedef struct threadobject threadobject;
+
+
+#include "config.h"
+
+#include <pthread.h>
+#include <ucontext.h>
+
+#include "vm/types.h"
+
+#include "mm/memory.h"
+#include "native/jni.h"
+#include "native/localref.h"
+#include "native/include/java_lang_Thread.h"
+
+#include "threads/native/lock.h"
+
+#include "vm/global.h"
+
+#include "vm/jit/stacktrace.h"
+
+#if defined(ENABLE_INTRP)
+#include "vm/jit/intrp/intrp.h"
+#endif
+
+#if defined(__DARWIN__)
+# include <mach/mach.h>
typedef struct {
- struct _threadobject *next, *prev;
- java_objectheader *_exceptionptr;
- methodinfo *_threadrootmethod;
- void *_stackframeinfo;
- pthread_t tid;
- pthread_mutex_t joinMutex;
- pthread_cond_t joinCond;
-} nativethread;
-
-typedef struct _threadobject {
- java_lang_Thread o;
- nativethread info;
- ExecEnvironment ee;
-} threadobject, thread;
-
-void monitorEnter(threadobject *, java_objectheader *);
-void monitorExit(threadobject *, java_objectheader *);
-
-void signal_cond_for_object (java_objectheader *obj);
-void broadcast_cond_for_object (java_objectheader *obj);
-void wait_cond_for_object (java_objectheader *obj, s8 time);
-
-void initThreadsEarly();
-void initThreads(u1 *stackbottom);
-void initLocks();
-void initThread(java_lang_Thread *);
-void joinAllThreads();
-
-bool aliveThread(java_lang_Thread *);
-void sleepThread (s8);
-void yieldThread();
-
-#if !defined(HAVE___THREAD)
-extern pthread_key_t tkey_threadinfo;
-#define THREADOBJECT ((java_lang_Thread*) pthread_getspecific(tkey_threadinfo))
-#define THREADINFO (&((threadobject*) pthread_getspecific(tkey_threadinfo))->info)
+ pthread_mutex_t mutex;
+ pthread_cond_t cond;
+ int value;
+} sem_t;
+
#else
-extern __thread threadobject *threadobj;
-#define THREADOBJECT ((java_lang_Thread*) threadobj)
-#define THREADINFO (&threadobj->info)
+# include <semaphore.h>
#endif
-#include "builtin.h"
-typedef struct {
- u1 *mcodebegin, *mcodeend;
-} threadcritnode;
+/* current threadobject *******************************************************/
+
+#if defined(HAVE___THREAD)
+
+#define THREADSPECIFIC __thread
+#define THREADOBJECT threads_current_threadobject
+
+extern __thread threadobject *threads_current_threadobject;
+
+#else /* defined(HAVE___THREAD) */
+
+#define THREADSPECIFIC
+#define THREADOBJECT \
+ ((threadobject *) pthread_getspecific(threads_current_threadobject_key))
+
+extern pthread_key_t threads_current_threadobject_key;
+
+#endif /* defined(HAVE___THREAD) */
+
+
+/* threadobject ****************************************************************
+
+ Struct holding thread local variables.
+
+*******************************************************************************/
+
+#define THREAD_FLAG_JAVA 0x01 /* a normal Java thread */
+#define THREAD_FLAG_INTERNAL 0x02 /* CACAO internal thread */
+#define THREAD_FLAG_DAEMON 0x04 /* daemon thread */
+
+
+struct threadobject {
+ java_lang_Thread *object; /* link to java.lang.Thread object */
+
+ ptrint thinlock; /* pre-computed thin lock value */
+
+ s4 index; /* thread index, starting with 1 */
+ u4 flags; /* flag field */
+ u4 state; /* state field */
+
+ pthread_t tid; /* pthread id */
+
+#if defined(__DARWIN__)
+ mach_port_t mach_thread; /* Darwin thread id */
+#endif
+
+ /* these are used for the wait/notify implementation */
+ pthread_mutex_t waitmutex;
+ pthread_cond_t waitcond;
+
+ bool interrupted;
+ bool signaled;
+ bool sleeping;
+
+ u1 *pc; /* current PC (used for profiling) */
+
+ java_object_t *_exceptionptr; /* current exception */
+ stackframeinfo *_stackframeinfo; /* current native stackframeinfo */
+ localref_table *_localref_table; /* JNI local references */
+
+#if defined(ENABLE_INTRP)
+ Cell *_global_sp; /* stack pointer for interpreter */
+#endif
+
+ dumpinfo_t dumpinfo; /* dump memory info structure */
+
+#if defined(ENABLE_DEBUG_FILTER)
+ u2 filterverbosecallctr[2]; /* counters for verbose call filter */
+#endif
+
+#if !defined(NDEBUG)
+ s4 tracejavacallindent;
+ u4 tracejavacallcount;
+#endif
+
+ listnode_t linkage; /* threads-list */
+};
+
+
+/* exception pointer **********************************************************/
+
+#define exceptionptr (&(THREADOBJECT->_exceptionptr))
+
+
+/* stackframeinfo *************************************************************/
+
+#define STACKFRAMEINFO (THREADOBJECT->_stackframeinfo)
+
+/* counter for verbose call filter ********************************************/
+
+#if defined(ENABLE_DEBUG_FILTER)
+# define FILTERVERBOSECALLCTR (THREADOBJECT->filterverbosecallctr)
+#endif
+
+/* state for trace java call **************************************************/
+
+#if !defined(NDEBUG)
+# define TRACEJAVACALLINDENT (THREADOBJECT->tracejavacallindent)
+# define TRACEJAVACALLCOUNT (THREADOBJECT->tracejavacallcount)
+#endif
+
+/* functions ******************************************************************/
+
+void threads_sem_init(sem_t *sem, bool shared, int value);
+void threads_sem_wait(sem_t *sem);
+void threads_sem_post(sem_t *sem);
+
+threadobject *threads_get_current_threadobject(void);
+
+bool threads_init(void);
+
+void threads_start_thread(threadobject *thread, functionptr function);
+
+void threads_set_thread_priority(pthread_t tid, int priority);
+
+bool threads_attach_current_thread(JavaVMAttachArgs *vm_aargs, bool isdaemon);
+bool threads_detach_thread(threadobject *thread);
+
+void threads_join_all_threads(void);
+
+void threads_sleep(s8 millis, s4 nanos);
+
+bool threads_wait_with_timeout_relative(threadobject *t, s8 millis, s4 nanos);
+
+void threads_thread_interrupt(threadobject *thread);
+bool threads_check_if_interrupted_and_reset(void);
+bool threads_thread_has_been_interrupted(threadobject *thread);
-void thread_registercritical(threadcritnode *);
+void threads_cast_stopworld(void);
+void threads_cast_startworld(void);
-extern volatile int stopworldwhere;
+#endif /* _THREADS_H */
-#endif /* _NATIVETHREAD_H */
+/*
+ * These are local overrides for various environment variables in Emacs.
+ * Please do not remove this and leave it at the end of the file, where
+ * Emacs will automagically detect them.
+ * ---------------------------------------------------------------------
+ * Local variables:
+ * mode: c
+ * indent-tabs-mode: t
+ * c-basic-offset: 4
+ * tab-width: 4
+ * End:
+ * vim:noexpandtab:sw=4:ts=4:
+ */