1 #ifndef _NATIVETHREAD_H
2 #define _NATIVETHREAD_H
5 #include "nat/java_lang_Object.h"
6 #include "nat/java_lang_Throwable.h"
7 #include "nat/java_lang_Thread.h"
9 #if defined(__DARWIN__)
10 #include <mach/mach.h>
12 /* We need to emulate recursive mutexes. */
18 typedef struct monitorLockRecord {
19 struct _threadobject *owner;
22 struct monitorLockRecord *queue;
23 struct monitorLockRecord *nextFree;
26 struct _lockRecordPool;
29 struct _lockRecordPool *next;
31 } lockRecordPoolHeader;
33 typedef struct _lockRecordPool {
34 lockRecordPoolHeader header;
35 monitorLockRecord lr[1];
38 #define INITIALLOCKRECORDS 8
40 /* Monitor lock implementation */
42 pthread_mutex_t metaLockMutex;
43 pthread_cond_t metaLockCond;
47 struct _threadobject *succ;
48 pthread_mutex_t monitorLockMutex;
49 pthread_cond_t monitorLockCond;
50 bool isWaitingForNotify;
52 monitorLockRecord *firstLR;
53 monitorLockRecord lr[INITIALLOCKRECORDS];
54 lockRecordPool *lrpool;
58 struct _threadobject *next, *prev;
59 java_objectheader *_exceptionptr;
60 methodinfo *_threadrootmethod;
61 void *_stackframeinfo;
63 #if defined(__DARWIN__)
64 mach_port_t mach_thread;
66 pthread_mutex_t joinMutex;
67 pthread_cond_t joinCond;
70 typedef struct _threadobject {
74 } threadobject, thread;
76 void monitorEnter(threadobject *, java_objectheader *);
77 void monitorExit(threadobject *, java_objectheader *);
79 void signal_cond_for_object (java_objectheader *obj);
80 void broadcast_cond_for_object (java_objectheader *obj);
81 void wait_cond_for_object (java_objectheader *obj, s8 time);
83 void initThreadsEarly();
84 void initThreads(u1 *stackbottom);
86 void initThread(java_lang_Thread *);
87 void joinAllThreads();
89 bool aliveThread(java_lang_Thread *);
90 void sleepThread(s8 millis, s4 nanos);
93 #if !defined(HAVE___THREAD)
94 extern pthread_key_t tkey_threadinfo;
95 #define THREADOBJECT ((java_lang_Thread*) pthread_getspecific(tkey_threadinfo))
96 #define THREADINFO (&((threadobject*) pthread_getspecific(tkey_threadinfo))->info)
98 extern __thread threadobject *threadobj;
99 #define THREADOBJECT ((java_lang_Thread*) threadobj)
100 #define THREADINFO (&threadobj->info)
105 /* This must not be changed, it is used in asm_criticalsections */
107 u1 *mcodebegin, *mcodeend, *mcoderestart;
110 void thread_registercritical(threadcritnode *);
111 u1 *thread_checkcritical(u1*);
113 extern volatile int stopworldwhere;
115 void cast_stopworld();
116 void cast_startworld();
118 #endif /* _NATIVETHREAD_H */