1 #ifndef _NATIVETHREAD_H
2 #define _NATIVETHREAD_H
7 #include "nat/java_lang_Object.h"
8 #include "nat/java_lang_Throwable.h"
9 #include "nat/java_lang_Thread.h"
10 #include "nat/java_lang_VMThread.h"
11 #include "toolbox/memory.h"
13 #if defined(__DARWIN__)
14 #include <mach/mach.h>
16 /* We need to emulate recursive mutexes. */
23 typedef struct monitorLockRecord monitorLockRecord;
25 struct monitorLockRecord {
26 struct _threadobject *ownerThread;
29 monitorLockRecord *nextFree;
31 monitorLockRecord *waiter;
32 monitorLockRecord *incharge;
35 pthread_mutex_t resolveLock;
36 pthread_cond_t resolveWait;
40 struct _lockRecordPool;
43 struct _lockRecordPool *next;
45 } lockRecordPoolHeader;
47 typedef struct _lockRecordPool {
48 lockRecordPoolHeader header;
49 monitorLockRecord lr[1];
52 /* Monitor lock implementation */
54 monitorLockRecord *firstLR;
55 lockRecordPool *lrpool;
60 struct _threadobject *next, *prev;
61 java_objectheader *_exceptionptr;
62 methodinfo *_threadrootmethod;
63 void *_stackframeinfo;
65 #if defined(__DARWIN__)
66 mach_port_t mach_thread;
68 pthread_mutex_t joinMutex;
69 pthread_cond_t joinCond;
72 typedef java_lang_Thread thread;
75 /* threadobject ****************************************************************
79 *******************************************************************************/
81 typedef struct _threadobject {
86 pthread_mutex_t waitLock;
87 pthread_cond_t waitCond;
92 dumpinfo dumpinfo; /* dump memory info structure */
96 monitorLockRecord *monitorEnter(threadobject *, java_objectheader *);
97 bool monitorExit(threadobject *, java_objectheader *);
99 bool threadHoldsLock(threadobject *t, java_objectheader *o);
100 void signal_cond_for_object (java_objectheader *obj);
101 void broadcast_cond_for_object (java_objectheader *obj);
102 void wait_cond_for_object (java_objectheader *obj, s8 time, s4 nanos);
104 void initThreadsEarly();
105 void initThreads(u1 *stackbottom);
106 void initObjectLock(java_objectheader *);
108 void initThread(java_lang_VMThread *);
109 void startThread(thread *t);
110 void joinAllThreads();
112 void sleepThread(s8 millis, s4 nanos);
115 void setPriorityThread(thread *t, s4 priority);
117 void interruptThread(java_lang_VMThread *);
118 bool interruptedThread();
119 bool isInterruptedThread(java_lang_VMThread *);
121 #if !defined(HAVE___THREAD)
122 extern pthread_key_t tkey_threadinfo;
123 #define THREADOBJECT ((java_lang_VMThread*) pthread_getspecific(tkey_threadinfo))
124 #define THREADINFO (&((threadobject*) pthread_getspecific(tkey_threadinfo))->info)
126 extern __thread threadobject *threadobj;
127 #define THREADOBJECT ((java_lang_VMThread*) threadobj)
128 #define THREADINFO (&threadobj->info)
133 /* This must not be changed, it is used in asm_criticalsections */
135 u1 *mcodebegin, *mcodeend, *mcoderestart;
138 void thread_registercritical(threadcritnode *);
139 u1 *thread_checkcritical(u1*);
141 extern volatile int stopworldwhere;
143 void cast_stopworld();
144 void cast_startworld();
146 #endif /* _NATIVETHREAD_H */
150 * These are local overrides for various environment variables in Emacs.
151 * Please do not remove this and leave it at the end of the file, where
152 * Emacs will automagically detect them.
153 * ---------------------------------------------------------------------
156 * indent-tabs-mode: t