1 #ifndef _NATIVETHREAD_H
2 #define _NATIVETHREAD_H
7 #include "nat/java_lang_Object.h" /* required by java/lang/VMThread */
8 #include "nat/java_lang_Thread.h"
9 #include "nat/java_lang_VMThread.h"
10 #include "toolbox/memory.h"
12 #if defined(__DARWIN__)
13 #include <mach/mach.h>
15 /* We need to emulate recursive mutexes. */
22 typedef struct monitorLockRecord monitorLockRecord;
24 struct monitorLockRecord {
25 struct _threadobject *ownerThread;
28 monitorLockRecord *nextFree;
30 monitorLockRecord *waiter;
31 monitorLockRecord *incharge;
34 pthread_mutex_t resolveLock;
35 pthread_cond_t resolveWait;
39 struct _lockRecordPool;
42 struct _lockRecordPool *next;
44 } lockRecordPoolHeader;
46 typedef struct _lockRecordPool {
47 lockRecordPoolHeader header;
48 monitorLockRecord lr[1];
51 /* Monitor lock implementation */
53 monitorLockRecord *firstLR;
54 lockRecordPool *lrpool;
59 struct _threadobject *next, *prev;
60 java_objectheader *_exceptionptr;
61 methodinfo *_threadrootmethod;
62 void *_stackframeinfo;
64 #if defined(__DARWIN__)
65 mach_port_t mach_thread;
67 pthread_mutex_t joinMutex;
68 pthread_cond_t joinCond;
71 typedef java_lang_Thread thread;
74 /* threadobject ****************************************************************
78 *******************************************************************************/
80 typedef struct _threadobject {
85 pthread_mutex_t waitLock;
86 pthread_cond_t waitCond;
91 dumpinfo dumpinfo; /* dump memory info structure */
95 monitorLockRecord *monitorEnter(threadobject *, java_objectheader *);
96 bool monitorExit(threadobject *, java_objectheader *);
98 bool threadHoldsLock(threadobject *t, java_objectheader *o);
99 void signal_cond_for_object (java_objectheader *obj);
100 void broadcast_cond_for_object (java_objectheader *obj);
101 void wait_cond_for_object (java_objectheader *obj, s8 time, s4 nanos);
103 void initThreadsEarly();
104 void initThreads(u1 *stackbottom);
105 void initObjectLock(java_objectheader *);
107 void initThread(java_lang_VMThread *);
108 void startThread(thread *t);
109 void joinAllThreads();
111 void sleepThread(s8 millis, s4 nanos);
114 void setPriorityThread(thread *t, s4 priority);
116 void interruptThread(java_lang_VMThread *);
117 bool interruptedThread();
118 bool isInterruptedThread(java_lang_VMThread *);
120 #if !defined(HAVE___THREAD)
121 extern pthread_key_t tkey_threadinfo;
122 #define THREADOBJECT ((java_lang_VMThread*) pthread_getspecific(tkey_threadinfo))
123 #define THREADINFO (&((threadobject*) pthread_getspecific(tkey_threadinfo))->info)
125 extern __thread threadobject *threadobj;
126 #define THREADOBJECT ((java_lang_VMThread*) threadobj)
127 #define THREADINFO (&threadobj->info)
132 /* This must not be changed, it is used in asm_criticalsections */
134 u1 *mcodebegin, *mcodeend, *mcoderestart;
137 void thread_registercritical(threadcritnode *);
138 u1 *thread_checkcritical(u1*);
140 extern volatile int stopworldwhere;
142 void cast_stopworld();
143 void cast_startworld();
145 #endif /* _NATIVETHREAD_H */
149 * These are local overrides for various environment variables in Emacs.
150 * Please do not remove this and leave it at the end of the file, where
151 * Emacs will automagically detect them.
152 * ---------------------------------------------------------------------
155 * indent-tabs-mode: t