* src/threads/native/threads.h (STACKFRAMEINFO): Return stackframeinfo
[cacao.git] / src / threads / native / threads.h
index 9e3cc5fdd5a50965424e93f608f310a75252cf69..63891e30e3d09547f23304e340417f1054d4fbd3 100644 (file)
@@ -1,6 +1,6 @@
 /* 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
-                       Edwin Steiner
-
-   $Id: threads.h 4866 2006-05-01 21:40:38Z edwin $
+   $Id: threads.h 7652 2007-04-03 14:23:16Z twisti $
 
 */
 
 #ifndef _THREADS_H
 #define _THREADS_H
 
+/* forward typedefs ***********************************************************/
+
+typedef struct threadobject          threadobject;
+typedef union  threads_table_entry_t threads_table_entry_t;
+typedef struct threads_table_t       threads_table_t;
+
+
 #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/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>
 
-/* We need to emulate recursive mutexes. */
-#define MUTEXSIM
+typedef struct {
+       pthread_mutex_t mutex;
+       pthread_cond_t cond;
+       int value;
+} sem_t;
+
+#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 *******************************************************************/
+/* threads_table_entry_t *******************************************************
 
-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;
+   An entry in the global threads table.
 
+*******************************************************************************/
 
-/* ExecEnvironment *************************************************************
+union threads_table_entry_t {
+       threadobject       *thread;        /* an existing thread                  */
+       ptrint              nextfree;      /* next free index                     */
+};
 
-   Monitor lock implementation
 
-*******************************************************************************/
+/* threads_table_t *************************************************************
 
-struct ExecEnvironment {
-       monitorLockRecord *firstLR;
-       lockRecordPool    *lrpool;
-       int                numlr;
-};
+   Struct for the global threads table.
 
+*******************************************************************************/
 
-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 threads_table_t {
+       threads_table_entry_t *table;      /* the table, threads[0] is the head   */
+                                          /* of the free list. Real entries      */
+                                                                          /* start at threads[1].                */
+       s4                     size;       /* current size of the table           */
 };
 
 
 /* threadobject ****************************************************************
 
-   Every java.lang.VMThread object is actually an instance of this
-   structure.
+   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_VMThread  o;
-       nativethread        info;           /* some general pthreads stuff        */
-       ExecEnvironment     ee;             /* contains our lock record pool      */
+       java_lang_Thread     *object;       /* link to java.lang.Thread object    */
 
-       /* these are used for the wait/notify implementation                      */
-       pthread_mutex_t     waitLock;
-       pthread_cond_t      waitCond;
-       bool                interrupted;
-       bool                signaled;
-       bool                isSleeping;
+       lock_execution_env_t  ee;           /* data for the lock implementation   */
 
-       dumpinfo            dumpinfo;       /* dump memory info structure         */
-};
+       threadobject         *next;         /* next thread in list, or self       */
+       threadobject         *prev;         /* prev thread in list, or self       */
 
-/* monitorLockRecord ***********************************************************
+       ptrint                thinlock;     /* pre-computed thin lock value       */
 
-   This is the really interesting stuff.
-   See handbook for a detailed description.
+       s4                    index;        /* thread index, starting with 1      */
+       u4                    flags;        /* flag field                         */
 
-*******************************************************************************/
+       pthread_t             tid;          /* pthread id                         */
 
-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;
-};
+#if defined(__DARWIN__)
+       mach_port_t           mach_thread;       /* Darwin thread id              */
+#endif
+
+       pthread_mutex_t       joinmutex;
+       pthread_cond_t        joincond;
 
+       /* these are used for the wait/notify implementation                      */
+       pthread_mutex_t       waitmutex;
+       pthread_cond_t        waitcond;
+
+       bool                  interrupted;
+       bool                  signaled;
+       bool                  sleeping;
 
-struct lockRecordPoolHeader {
-       lockRecordPool *next;
-       int             size;
-}; 
+       u1                   *pc;           /* current PC (used for profiling)    */
 
-struct lockRecordPool {
-       lockRecordPoolHeader header;
-       monitorLockRecord    lr[1];
+       java_objectheader    *_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         */
 };
 
-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);
 
-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 *);
 
-/* start a thread */
-void threads_start_thread(thread *t, functionptr function);
+/* variables ******************************************************************/
 
-void joinAllThreads();
+extern threadobject *mainthreadobj;
 
-void thread_sleep(s8 millis, s4 nanos);
-void yieldThread();
 
-void setPriorityThread(thread *t, s4 priority);
+/* 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);
 
-void interruptThread(java_lang_VMThread *);
-bool interruptedThread();
-bool isInterruptedThread(java_lang_VMThread *);
+void threads_preinit(void);
+bool threads_init(void);
 
-#if defined(ENABLE_JVMTI)
-void setthreadobject(threadobject *thread);
-#endif
+void threads_start_javathread(java_lang_Thread *object);
+void threads_start_thread(threadobject *thread, functionptr function);
 
+void threads_set_thread_priority(pthread_t tid, int priority);
 
-/* This must not be changed, it is used in asm_criticalsections */
-typedef struct {
-       u1 *mcodebegin;
-       u1 *mcodeend;
-       u1 *mcoderestart;
-} threadcritnode;
+bool threads_attach_current_thread(JavaVMAttachArgs *vm_aargs, bool isdaemon);
+bool threads_detach_thread(threadobject *thread);
 
-void thread_registercritical(threadcritnode *);
-u1 *thread_checkcritical(u1*);
+void threads_join_all_threads(void);
 
-extern volatile int stopworldwhere;
-extern threadobject *mainthreadobj;
+void threads_sleep(s8 millis, s4 nanos);
+void threads_yield(void);
 
-extern pthread_mutex_t pool_lock;
-extern lockRecordPool *global_pool;
+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 cast_stopworld();
-void cast_startworld();
+void threads_cast_stopworld(void);
+void threads_cast_startworld(void);
 
-/* dumps all threads */
 void threads_dump(void);
 
-/* this is a machine dependent functions (src/vm/jit/$(ARCH_DIR)/md.c) */
-void thread_restartcriticalsection(ucontext_t *);
-
 #endif /* _THREADS_H */