Merged revisions 8299-8320 via svnmerge from
[cacao.git] / src / threads / native / threads.h
index 1f5da3c35544e1df5bbef27b2c2a9f8bf730575f..03c52bbd96f3777bfb51a28d16c36ed51308c2d5 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
-                       Edwin Steiner
-
-   Changes: Christian Thalinger
-
-   $Id: threads.h 5698 2006-10-05 17:28:13Z twisti $
+   $Id: threads.h 8321 2007-08-16 11:37:25Z michi $
 
 */
 
 #ifndef _THREADS_H
 #define _THREADS_H
 
+/* forward typedefs ***********************************************************/
+
+typedef struct threadobject threadobject;
+
+
 #include "config.h"
 
 #include <pthread.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 "vm/global.h"
 
 #include "threads/native/lock.h"
 
+#include "vm/global.h"
+
+#if defined(ENABLE_GC_CACAO)
+# include "vm/jit/replace.h"
+#endif
+
+#include "vm/jit/stacktrace.h"
+
+#if defined(ENABLE_INTRP)
+#include "vm/jit/intrp/intrp.h"
+#endif
+
 #if defined(__DARWIN__)
 # include <mach/mach.h>
 
-/* We need to emulate recursive mutexes. */
-# define MUTEXSIM
-
 typedef struct {
        pthread_mutex_t mutex;
        pthread_cond_t cond;
@@ -73,20 +75,6 @@ typedef struct {
 #endif
 
 
-/* forward typedefs ***********************************************************/
-
-typedef struct threadobject          threadobject;
-typedef union  threads_table_entry_t threads_table_entry_t;
-typedef struct threads_table_t       threads_table_t;
-
-
-/* thread priorities **********************************************************/
-
-#define MIN_PRIORITY     1
-#define NORM_PRIORITY    5
-#define MAX_PRIORITY     10
-
-
 /* current threadobject *******************************************************/
 
 #if defined(HAVE___THREAD)
@@ -100,62 +88,36 @@ extern __thread threadobject *threads_current_threadobject;
 
 #define THREADSPECIFIC
 #define THREADOBJECT \
-       ((threadobject *)pthread_getspecific(threads_current_threadobject_key))
+       ((threadobject *) pthread_getspecific(threads_current_threadobject_key))
 
 extern pthread_key_t threads_current_threadobject_key;
 
 #endif /* defined(HAVE___THREAD) */
 
 
-/* threads_table_entry_t *******************************************************
-
-   An entry in the global threads table.
-
-*******************************************************************************/
-
-union threads_table_entry_t {
-       threadobject       *thread;        /* an existing thread                  */
-       ptrint              nextfree;      /* next free index                     */
-};
-
-
-/* threads_table_t *************************************************************
-
-   Struct for the global threads table.
-
-*******************************************************************************/
-
-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                      */
+#define THREAD_FLAG_IN_NATIVE   0x08    /* currently executing native code    */
 
+#define SUSPEND_REASON_JNI       1      /* suspended from JNI                 */
+#define SUSPEND_REASON_STOPWORLD 2      /* suspended from stop-thw-world      */
 
-struct threadobject {
-       java_lang_VMThread    o;            /* the java.lang.VMThread object      */
 
-       lock_execution_env_t  ee;           /* data for the lock implementation   */
-
-       threadobject         *next;         /* next thread in list, or self       */
-       threadobject         *prev;         /* prev thread in list, or self       */
+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      */
-       u1                    flags;        /* flag field                         */
+       u4                    flags;        /* flag field                         */
+       u4                    state;        /* state field                        */
 
        pthread_t             tid;          /* pthread id                         */
 
@@ -163,35 +125,73 @@ struct threadobject {
        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;
 
+       pthread_mutex_t       suspendmutex; /* lock before suspending this thread */
+       pthread_cond_t        suspendcond;  /* notify to resume this thread       */
+
        bool                  interrupted;
        bool                  signaled;
        bool                  sleeping;
 
+       bool                  suspended;    /* is this thread suspended?          */
+       s4                    suspend_reason; /* reason for suspending            */
+
        u1                   *pc;           /* current PC (used for profiling)    */
 
-       java_objectheader    *_exceptionptr;     /* current exception             */
+       java_object_t        *_exceptionptr;     /* current exception             */
        stackframeinfo       *_stackframeinfo;   /* current native stackframeinfo */
        localref_table       *_localref_table;   /* JNI local references          */
 
 #if defined(ENABLE_INTRP)
-       u1                   *_global_sp;        /* stack pointer for interpreter */
+       Cell                 *_global_sp;        /* stack pointer for interpreter */
 #endif
 
-       dumpinfo              dumpinfo;     /* dump memory info structure         */
+#if defined(ENABLE_GC_CACAO)
+       bool                  gc_critical;  /* indicates a critical section       */
+
+       sourcestate_t        *ss;
+       executionstate_t     *es;
+#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                       */
 };
 
 
-/* variables ******************************************************************/
+/* exception pointer **********************************************************/
+
+#define exceptionptr      (&(THREADOBJECT->_exceptionptr))
+
+
+/* stackframeinfo *************************************************************/
 
-extern threadobject *mainthreadobj;
+#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 ******************************************************************/
 
@@ -201,60 +201,33 @@ void threads_sem_post(sem_t *sem);
 
 threadobject *threads_get_current_threadobject(void);
 
-void threads_preinit(void);
 bool threads_init(void);
 
-void threads_init_threadobject(java_lang_VMThread *);
+void threads_start_thread(threadobject *thread, functionptr function);
 
-void threads_start_thread(java_lang_Thread *t, 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);
 
+bool threads_suspend_thread(threadobject *thread, s4 reason);
+void threads_suspend_ack(u1* pc, u1* sp);
+bool threads_resume_thread(threadobject *thread);
+
 void threads_join_all_threads(void);
 
 void threads_sleep(s8 millis, s4 nanos);
-void threads_yield(void);
 
 bool threads_wait_with_timeout_relative(threadobject *t, s8 millis, s4 nanos);
 
-void threads_interrupt_thread(java_lang_VMThread *);
+void threads_thread_interrupt(threadobject *thread);
 bool threads_check_if_interrupted_and_reset(void);
-bool threads_thread_has_been_interrupted(java_lang_VMThread *);
-
-void threads_java_lang_Thread_set_priority(java_lang_Thread *t, s4 priority);
-
-void threads_cast_stopworld(void);
-void threads_cast_startworld(void);
-
-void threads_dump(void);
-
-/******************************************************************************/
-/* Recursive Mutex Implementation for Darwin                                  */
-/******************************************************************************/
+bool threads_thread_has_been_interrupted(threadobject *thread);
 
-#if defined(MUTEXSIM)
-
-/* We need this for older MacOSX (10.1.x) */
-
-typedef struct {
-       pthread_mutex_t mutex;
-       pthread_t owner;
-       int count;
-} pthread_mutex_rec_t;
-
-void pthread_mutex_init_rec(pthread_mutex_rec_t *m);
-void pthread_mutex_destroy_rec(pthread_mutex_rec_t *m);
-void pthread_mutex_lock_rec(pthread_mutex_rec_t *m);
-void pthread_mutex_unlock_rec(pthread_mutex_rec_t *m);
-
-#else /* !defined(MUTEXSIM) */
-
-#define pthread_mutex_lock_rec pthread_mutex_lock
-#define pthread_mutex_unlock_rec pthread_mutex_unlock
-#define pthread_mutex_rec_t pthread_mutex_t
-
-#endif /* defined(MUTEXSIM) */
+#if !defined(DISABLE_GC)
+void threads_stopworld(void);
+void threads_startworld(void);
+#endif
 
 #endif /* _THREADS_H */