/* src/threads/posix/thread-posix.hpp - POSIX thread functions
- Copyright (C) 1996-2005, 2006, 2007, 2008
+ Copyright (C) 1996-2011
CACAOVM - Verein zur Foerderung der freien virtuellen Maschine CACAO
This file is part of CACAO.
#ifndef _THREAD_POSIX_HPP
#define _THREAD_POSIX_HPP
-/* forward typedefs ***********************************************************/
-
-typedef struct threadobject threadobject;
-
-
#include "config.h"
#include <pthread.h>
#include "vm/types.h"
-#include "mm/memory.h"
+
+// Includes required by Thread.
#if defined(ENABLE_TLH)
-#include "mm/tlh.h"
+# include "mm/tlh.h"
#endif
-#include "native/localref.h"
-
#include "threads/condition.hpp"
#include "threads/mutex.hpp"
-#include "threads/posix/lock.h"
-
#include "vm/global.h"
-#include "vm/vm.hpp"
-
-#if defined(ENABLE_GC_CACAO)
-# include "vm/jit/executionstate.h"
-# include "vm/jit/replace.h"
-#endif
-
-#include "vm/jit/stacktrace.hpp"
-
-#if defined(ENABLE_INTRP)
-#include "vm/jit/intrp/intrp.h"
-#endif
-
-#if defined(__DARWIN__)
-# include <mach/mach.h>
-
-typedef struct {
- Mutex* mutex;
- Condition* cond;
- int value;
-} sem_t;
-
-#else
-# include <semaphore.h>
-#endif
-
-
-// FIXME
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-/* current threadobject *******************************************************/
-
-#if defined(HAVE___THREAD)
-
-#define THREADOBJECT thread_current
-
-extern __thread threadobject *thread_current;
-
-#else /* defined(HAVE___THREAD) */
-
-#define THREADOBJECT \
- ((threadobject *) pthread_getspecific(thread_current_key))
-
-extern pthread_key_t thread_current_key;
-
-#endif /* defined(HAVE___THREAD) */
/* threadobject ****************************************************************
#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 */
+#define SUSPEND_REASON_NONE 0 /* no reason to suspend */
+#define SUSPEND_REASON_JAVA 1 /* suspended from java.lang.Thread */
+#define SUSPEND_REASON_STOPWORLD 2 /* suspended from stop-the-world */
+#define SUSPEND_REASON_DUMP 3 /* suspended from threadlist dumping */
+#define SUSPEND_REASON_JVMTI 4 /* suspended from JVMTI agent */
+typedef struct threadobject threadobject;
+
struct threadobject {
java_object_t *object; /* link to java.lang.Thread object */
s4 index; /* thread index, starting with 1 */
u4 flags; /* flag field */
u4 state; /* state field */
+ bool is_in_active_list; /* for debugging only */
pthread_t tid; /* pthread id */
/* for the sable tasuki lock extension */
bool flc_bit;
struct threadobject *flc_list; /* FLC list head for this thread */
+ struct threadobject *flc_tail; /* tail pointer for FLC list */
struct threadobject *flc_next; /* next pointer for FLC list */
java_handle_t *flc_object;
Mutex* flc_lock; /* controlling access to these fields */
bool interrupted;
bool signaled;
+ bool park_permit;
bool suspended; /* is this thread suspended? */
s4 suspend_reason; /* reason for suspending */
u1 *pc; /* current PC (used for profiling) */
java_object_t *_exceptionptr; /* current exception */
- stackframeinfo_t *_stackframeinfo; /* current native stackframeinfo */
- localref_table *_localref_table; /* JNI local references */
+ struct stackframeinfo_t *_stackframeinfo; /* current native stackframeinfo */
+ struct localref_table *_localref_table; /* JNI local references */
#if defined(ENABLE_INTRP)
Cell *_global_sp; /* stack pointer for interpreter */
executionstate_t *es;
#endif
- dumpinfo_t dumpinfo; /* dump memory info structure */
+ struct DumpMemory* _dumpmemory; ///< Dump memory structure.
#if defined(ENABLE_DEBUG_FILTER)
u2 filterverbosecallctr[2]; /* counters for verbose call filter */
#if defined(ENABLE_ESCAPE_REASON)
void *escape_reasons;
#endif
-
- listnode_t linkage; /* threads-list */
- listnode_t linkage_free; /* free-list */
};
+/* current threadobject *******************************************************/
+
+#if defined(HAVE___THREAD)
+
+#define THREADOBJECT thread_current
+
+extern __thread threadobject *thread_current;
+
+#else /* defined(HAVE___THREAD) */
+
+#define THREADOBJECT \
+ ((threadobject *) pthread_getspecific(thread_current_key))
+
+extern pthread_key_t thread_current_key;
+
+#endif /* defined(HAVE___THREAD) */
+
+
/* native-world flags *********************************************************/
#if defined(ENABLE_GC_CACAO)
#endif
-/* inline functions ***********************************************************/
+// FIXME
+#ifdef __cplusplus
+extern "C" {
+#endif
+inline static threadobject* thread_get_current(void);
+#ifdef __cplusplus
+}
+#endif
-/* thread_get_current **********************************************************
- Return the threadobject of the current thread.
-
- RETURN:
- the current threadobject *
+// Includes.
+#include "mm/memory.hpp"
-*******************************************************************************/
+#include "native/localref.hpp"
+
+#include "threads/lock.hpp"
+
+#include "vm/global.h"
+#include "vm/vm.hpp"
-inline static threadobject *thread_get_current(void)
+#if defined(ENABLE_GC_CACAO)
+# include "vm/jit/executionstate.h"
+# include "vm/jit/replace.hpp"
+#endif
+
+#if defined(ENABLE_INTRP)
+#include "vm/jit/intrp/intrp.h"
+#endif
+
+
+// FIXME
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* inline functions ***********************************************************/
+
+/**
+ * Return the Thread object of the current thread.
+ *
+ * @return The current Thread object.
+ */
+inline static threadobject* thread_get_current(void)
{
threadobject *t;
}
-/* thread_set_current **********************************************************
-
- Set the current thread object.
-
- IN:
- t ... the thread object to set
-
-*******************************************************************************/
-
-inline static void thread_set_current(threadobject *t)
+/**
+ * Set the current Thread object.
+ *
+ * @param t The thread object to set.
+ */
+inline static void thread_set_current(threadobject* t)
{
#if defined(HAVE___THREAD)
thread_current = t;
result = pthread_setspecific(thread_current_key, t);
if (result != 0)
- vm_abort_errnum(result, "thread_set_current: pthread_setspecific failed");
+ //os::abort_errnum(result, "thread_set_current: pthread_setspecific failed");
+ vm_abort("thread_set_current: pthread_setspecific failed");
#endif
}
-inline static stackframeinfo_t *threads_get_current_stackframeinfo(void)
+inline static struct stackframeinfo_t* threads_get_current_stackframeinfo(void)
{
return THREADOBJECT->_stackframeinfo;
}
-inline static void threads_set_current_stackframeinfo(stackframeinfo_t *sfi)
+inline static void threads_set_current_stackframeinfo(struct stackframeinfo_t* sfi)
{
THREADOBJECT->_stackframeinfo = sfi;
}
/* 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);
-
void threads_start_thread(threadobject *thread, functionptr function);
void threads_set_thread_priority(pthread_t tid, int priority);
-#if defined(ENABLE_GC_CACAO)
-bool threads_suspend_thread(threadobject *thread, s4 reason);
-void threads_suspend_ack(u1* pc, u1* sp);
-bool threads_resume_thread(threadobject *thread);
-#endif
+bool threads_suspend_thread(threadobject *thread, int32_t reason);
+bool threads_resume_thread(threadobject *thread, int32_t reason);
+void threads_suspend_ack();
void threads_join_all_threads(void);
void threads_thread_interrupt(threadobject *thread);
+void threads_park(bool absolute, int64_t nanos);
+void threads_unpark(threadobject *thread);
+
#if defined(ENABLE_TLH)
void threads_tlh_add_frame();
void threads_tlh_remove_frame();