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"
8 #include "nat/java_lang_VMThread.h"
10 #if defined(__DARWIN__)
11 #include <mach/mach.h>
13 /* We need to emulate recursive mutexes. */
19 typedef struct _monitorLockRecord {
20 struct _threadobject *ownerThread;
23 struct _monitorLockRecord *nextFree;
25 struct _monitorLockRecord *waiter, *incharge;
28 pthread_mutex_t resolveLock, waitLock;
29 pthread_cond_t resolveWait, waitCond;
32 struct _lockRecordPool;
35 struct _lockRecordPool *next;
37 } lockRecordPoolHeader;
39 typedef struct _lockRecordPool {
40 lockRecordPoolHeader header;
41 monitorLockRecord lr[1];
44 /* Monitor lock implementation */
46 monitorLockRecord *firstLR;
47 lockRecordPool *lrpool;
52 struct _threadobject *next, *prev;
53 java_objectheader *_exceptionptr;
54 methodinfo *_threadrootmethod;
55 void *_stackframeinfo;
57 #if defined(__DARWIN__)
58 mach_port_t mach_thread;
60 pthread_mutex_t joinMutex;
61 pthread_cond_t joinCond;
64 typedef java_lang_Thread thread;
66 typedef struct _threadobject {
72 monitorLockRecord *waiting;
75 monitorLockRecord *monitorEnter(threadobject *, java_objectheader *);
76 bool monitorExit(threadobject *, java_objectheader *);
78 bool threadHoldsLock(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, s4 nanos);
83 void initThreadsEarly();
84 void initThreads(u1 *stackbottom);
85 void initObjectLock(java_objectheader *);
87 void initThread(java_lang_VMThread *);
88 void joinAllThreads();
90 void sleepThread(s8 millis, s4 nanos);
93 void interruptThread(java_lang_VMThread *);
94 bool interruptedThread();
95 bool isInterruptedThread(java_lang_VMThread *);
97 #if !defined(HAVE___THREAD)
98 extern pthread_key_t tkey_threadinfo;
99 #define THREADOBJECT ((java_lang_VMThread*) pthread_getspecific(tkey_threadinfo))
100 #define THREADINFO (&((threadobject*) pthread_getspecific(tkey_threadinfo))->info)
102 extern __thread threadobject *threadobj;
103 #define THREADOBJECT ((java_lang_VMThread*) threadobj)
104 #define THREADINFO (&threadobj->info)
109 /* This must not be changed, it is used in asm_criticalsections */
111 u1 *mcodebegin, *mcodeend, *mcoderestart;
114 void thread_registercritical(threadcritnode *);
115 u1 *thread_checkcritical(u1*);
117 extern volatile int stopworldwhere;
119 void cast_stopworld();
120 void cast_startworld();
122 #endif /* _NATIVETHREAD_H */