/* src/threads/native/threads.h - native threads header
- Copyright (C) 1996-2005, 2006 R. Grafl, A. Krall, C. Kruegel,
+ 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
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
02110-1301, USA.
- Contact: cacao@cacaojvm.org
-
- Authors: Stefan Ring
-
- Changes: Christian Thalinger
-
- $Id: threads.h 4854 2006-04-27 23:03:37Z twisti $
-
*/
#ifndef _THREADS_H
#define _THREADS_H
+/* forward typedefs ***********************************************************/
+
+typedef struct threadobject threadobject;
+
+
#include "config.h"
#include <pthread.h>
-#include <semaphore.h>
#include <ucontext.h>
#include "vm/types.h"
-#include "config.h"
-#include "vm/types.h"
-
#include "mm/memory.h"
#include "native/jni.h"
-#include "native/include/java_lang_Object.h" /* required by java/lang/VMThread*/
+#include "native/localref.h"
#include "native/include/java_lang_Thread.h"
-#include "native/include/java_lang_VMThread.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>
+# include <mach/mach.h>
+
+typedef struct {
+ pthread_mutex_t mutex;
+ pthread_cond_t cond;
+ int value;
+} sem_t;
-/* We need to emulate recursive mutexes. */
-#define MUTEXSIM
+#else
+# include <semaphore.h>
#endif
+/* current threadobject *******************************************************/
+
#if defined(HAVE___THREAD)
#define THREADSPECIFIC __thread
-#define THREADOBJECT threadobj
-#define THREADINFO (&threadobj->info)
+#define THREADOBJECT threads_current_threadobject
-extern __thread threadobject *threadobj;
+extern __thread threadobject *threads_current_threadobject;
#else /* defined(HAVE___THREAD) */
#define THREADSPECIFIC
-#define THREADOBJECT pthread_getspecific(tkey_threadinfo)
-#define THREADINFO (&((threadobject*) pthread_getspecific(tkey_threadinfo))->info)
+#define THREADOBJECT \
+ ((threadobject *) pthread_getspecific(threads_current_threadobject_key))
-extern pthread_key_t tkey_threadinfo;
+extern pthread_key_t threads_current_threadobject_key;
#endif /* defined(HAVE___THREAD) */
-/* typedefs *******************************************************************/
-
-typedef struct ExecEnvironment ExecEnvironment;
-typedef struct nativethread nativethread;
-typedef struct threadobject threadobject;
-typedef struct monitorLockRecord monitorLockRecord;
-typedef struct lockRecordPoolHeader lockRecordPoolHeader;
-typedef struct lockRecordPool lockRecordPool;
-typedef java_lang_Thread thread;
-
-
-/* ExecEnvironment *************************************************************
+/* threadobject ****************************************************************
- Monitor lock implementation
+ Struct holding thread local variables.
*******************************************************************************/
-struct ExecEnvironment {
- monitorLockRecord *firstLR;
- lockRecordPool *lrpool;
- int numlr;
-};
-
+#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 nativethread {
- threadobject *next;
- threadobject *prev;
- java_objectheader *_exceptionptr;
- stackframeinfo *_stackframeinfo;
- localref_table *_localref_table; /* JNI local references */
-#if defined(ENABLE_INTRP)
- void *_global_sp;
-#endif
- pthread_t tid;
-#if defined(__DARWIN__)
- mach_port_t mach_thread;
-#endif
- pthread_mutex_t joinMutex;
- pthread_cond_t joinCond;
-};
+struct threadobject {
+ java_lang_Thread *object; /* link to java.lang.Thread object */
-/* threadobject ****************************************************************
+ ptrint thinlock; /* pre-computed thin lock value */
- Every java.lang.VMThread object is actually an instance of this
- structure.
+ s4 index; /* thread index, starting with 1 */
+ u4 flags; /* flag field */
+ u4 state; /* state field */
-*******************************************************************************/
+ pthread_t tid; /* pthread id */
-struct threadobject {
- java_lang_VMThread o;
- nativethread info; /* some general pthreads stuff */
- ExecEnvironment ee; /* contains our lock record pool */
+#if defined(__DARWIN__)
+ mach_port_t mach_thread; /* Darwin thread id */
+#endif
/* these are used for the wait/notify implementation */
- pthread_mutex_t waitLock;
- pthread_cond_t waitCond;
- bool interrupted;
- bool signaled;
- bool isSleeping;
+ pthread_mutex_t waitmutex;
+ pthread_cond_t waitcond;
- dumpinfo dumpinfo; /* dump memory info structure */
-};
+ bool interrupted;
+ bool signaled;
+ bool sleeping;
-/* monitorLockRecord ***********************************************************
+ u1 *pc; /* current PC (used for profiling) */
- This is the really interesting stuff.
- See handbook for a detailed description.
+ 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
-struct monitorLockRecord {
- threadobject *ownerThread;
- java_objectheader *o;
- s4 lockCount;
- monitorLockRecord *nextFree;
- s4 queuers;
- monitorLockRecord *waiter;
- monitorLockRecord *incharge;
- java_objectheader *waiting;
- sem_t queueSem;
- pthread_mutex_t resolveLock;
- pthread_cond_t resolveWait;
-};
+ dumpinfo_t dumpinfo; /* dump memory info structure */
+#if defined(ENABLE_DEBUG_FILTER)
+ u2 filterverbosecallctr[2]; /* counters for verbose call filter */
+#endif
-struct lockRecordPoolHeader {
- lockRecordPool *next;
- int size;
-};
+#if !defined(NDEBUG)
+ s4 tracejavacallindent;
+ u4 tracejavacallcount;
+#endif
-struct lockRecordPool {
- lockRecordPoolHeader header;
- monitorLockRecord lr[1];
+ listnode_t linkage; /* threads-list */
};
-monitorLockRecord *monitorEnter(threadobject *, java_objectheader *);
-bool monitorExit(threadobject *, java_objectheader *);
+/* exception pointer **********************************************************/
-bool threadHoldsLock(threadobject *t, java_objectheader *o);
+#define exceptionptr (&(THREADOBJECT->_exceptionptr))
-void wait_cond_for_object(java_objectheader *o, s8 millis, s4 nanos);
-void signal_cond_for_object(java_objectheader *o);
-void broadcast_cond_for_object(java_objectheader *o);
-void *thread_getself(void);
+/* stackframeinfo *************************************************************/
-void threads_preinit(void);
-bool threads_init(u1 *stackbottom);
+#define STACKFRAMEINFO (THREADOBJECT->_stackframeinfo)
-void initObjectLock(java_objectheader *);
-monitorLockRecord *get_dummyLR(void);
-void initLocks();
-void initThread(java_lang_VMThread *);
+/* counter for verbose call filter ********************************************/
-/* start a thread */
-void threads_start_thread(thread *t, functionptr function);
+#if defined(ENABLE_DEBUG_FILTER)
+# define FILTERVERBOSECALLCTR (THREADOBJECT->filterverbosecallctr)
+#endif
-void joinAllThreads();
+/* state for trace java call **************************************************/
-void thread_sleep(s8 millis, s4 nanos);
-void yieldThread();
+#if !defined(NDEBUG)
+# define TRACEJAVACALLINDENT (THREADOBJECT->tracejavacallindent)
+# define TRACEJAVACALLCOUNT (THREADOBJECT->tracejavacallcount)
+#endif
-void setPriorityThread(thread *t, s4 priority);
+/* functions ******************************************************************/
-void interruptThread(java_lang_VMThread *);
-bool interruptedThread();
-bool isInterruptedThread(java_lang_VMThread *);
+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);
-#if defined(ENABLE_JVMTI)
-void setthreadobject(threadobject *thread);
-#endif
+threadobject *threads_get_current_threadobject(void);
+bool threads_init(void);
-/* This must not be changed, it is used in asm_criticalsections */
-typedef struct {
- u1 *mcodebegin;
- u1 *mcodeend;
- u1 *mcoderestart;
-} threadcritnode;
+void threads_start_thread(threadobject *thread, functionptr function);
-void thread_registercritical(threadcritnode *);
-u1 *thread_checkcritical(u1*);
+void threads_set_thread_priority(pthread_t tid, int priority);
-extern volatile int stopworldwhere;
-extern threadobject *mainthreadobj;
+bool threads_attach_current_thread(JavaVMAttachArgs *vm_aargs, bool isdaemon);
+bool threads_detach_thread(threadobject *thread);
-extern pthread_mutex_t pool_lock;
-extern lockRecordPool *global_pool;
+void threads_join_all_threads(void);
+void threads_sleep(s8 millis, s4 nanos);
-void cast_stopworld();
-void cast_startworld();
+bool threads_wait_with_timeout_relative(threadobject *t, s8 millis, s4 nanos);
-/* dumps all threads */
-void threads_dump(void);
+void threads_thread_interrupt(threadobject *thread);
+bool threads_check_if_interrupted_and_reset(void);
+bool threads_thread_has_been_interrupted(threadobject *thread);
-/* this is a machine dependent functions (src/vm/jit/$(ARCH_DIR)/md.c) */
-void thread_restartcriticalsection(ucontext_t *);
+void threads_cast_stopworld(void);
+void threads_cast_startworld(void);
#endif /* _THREADS_H */
* c-basic-offset: 4
* tab-width: 4
* End:
+ * vim:noexpandtab:sw=4:ts=4:
*/