X-Git-Url: http://wien.tomnetworks.com/gitweb/?a=blobdiff_plain;f=src%2Fthreads%2Fposix%2Fthread-posix.hpp;h=e24f6cc2ee8fee6c75b1f7c1e6f61fb8a981211e;hb=67702ed5605e84f33724aeee9ccf5f82ea774084;hp=424ab84973ae45e08ee0b980b1cba389fbdf02d9;hpb=0ed432e1a052ff71249ff38a548d4a477f26a684;p=cacao.git diff --git a/src/threads/posix/thread-posix.hpp b/src/threads/posix/thread-posix.hpp index 424ab8497..e24f6cc2e 100644 --- a/src/threads/posix/thread-posix.hpp +++ b/src/threads/posix/thread-posix.hpp @@ -57,8 +57,11 @@ #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; @@ -96,6 +99,7 @@ struct threadobject { bool interrupted; bool signaled; + bool park_permit; bool suspended; /* is this thread suspended? */ s4 suspend_reason; /* reason for suspending */ @@ -192,7 +196,7 @@ inline static threadobject* thread_get_current(void); // Includes. -#include "mm/memory.h" +#include "mm/memory.hpp" #include "native/localref.hpp" @@ -210,19 +214,6 @@ inline static threadobject* thread_get_current(void); #include "vm/jit/intrp/intrp.h" #endif -#if defined(__DARWIN__) -# include - -typedef struct { - Mutex* mutex; - Condition* cond; - int value; -} sem_t; - -#else -# include -#endif - // FIXME #ifdef __cplusplus @@ -265,7 +256,8 @@ inline static void thread_set_current(threadobject* 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 } @@ -283,19 +275,13 @@ inline static void threads_set_current_stackframeinfo(struct stackframeinfo_t* s /* 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); @@ -305,6 +291,9 @@ void threads_wait_with_timeout_relative(threadobject *t, s8 millis, s4 nanos); 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();