229414b447b23acd3fa34fbfaecdbdd7445fff11
[cacao.git] / threads / nativethread.h
1 #ifndef _NATIVETHREAD_H
2 #define _NATIVETHREAD_H
3
4 #include "jni.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"
9
10 #if defined(__DARWIN__)
11 #include <mach/mach.h>
12
13 /* We need to emulate recursive mutexes. */
14 #define MUTEXSIM
15 #endif
16
17 struct _threadobject;
18
19 typedef struct _monitorLockRecord {
20         struct _threadobject *ownerThread;
21         java_objectheader *o;
22         int lockCount;
23         struct _monitorLockRecord *nextFree;
24         int queuers;
25         struct _monitorLockRecord *waiter, *incharge;
26         bool waiting;
27         sem_t queueSem;
28         pthread_mutex_t resolveLock, waitLock;
29         pthread_cond_t resolveWait, waitCond;
30 } monitorLockRecord;
31
32 struct _lockRecordPool;
33
34 typedef struct {
35         struct _lockRecordPool *next;
36         int size;
37 } lockRecordPoolHeader; 
38
39 typedef struct _lockRecordPool {
40         lockRecordPoolHeader header;
41         monitorLockRecord lr[1];
42 } lockRecordPool;
43
44 /* Monitor lock implementation */
45 typedef struct {
46         monitorLockRecord *firstLR;
47         lockRecordPool *lrpool;
48         int numlr;
49 } ExecEnvironment;
50
51 typedef struct {
52         struct _threadobject *next, *prev;
53         java_objectheader *_exceptionptr;
54         methodinfo *_threadrootmethod;
55         void *_stackframeinfo;
56         pthread_t tid;
57 #if defined(__DARWIN__)
58         mach_port_t mach_thread;
59 #endif
60         pthread_mutex_t joinMutex;
61         pthread_cond_t joinCond;
62 } nativethread;
63
64 typedef java_lang_Thread thread;
65
66 typedef struct _threadobject {
67         java_lang_VMThread o;
68         nativethread info;
69         ExecEnvironment ee;
70
71         long interrupted;
72         monitorLockRecord *waiting;
73 } threadobject;
74
75 monitorLockRecord *monitorEnter(threadobject *, java_objectheader *);
76 bool monitorExit(threadobject *, java_objectheader *);
77
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);
82
83 void initThreadsEarly();
84 void initThreads(u1 *stackbottom);
85 void initObjectLock(java_objectheader *);
86 void initLocks();
87 void initThread(java_lang_VMThread *);
88 void joinAllThreads();
89
90 void sleepThread(s8 millis, s4 nanos);
91 void yieldThread();
92
93 void interruptThread(java_lang_VMThread *);
94 bool interruptedThread();
95 bool isInterruptedThread(java_lang_VMThread *);
96
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)
101 #else
102 extern __thread threadobject *threadobj;
103 #define THREADOBJECT ((java_lang_VMThread*) threadobj)
104 #define THREADINFO (&threadobj->info)
105 #endif
106
107 #include "builtin.h"
108
109 /* This must not be changed, it is used in asm_criticalsections */
110 typedef struct {
111         u1 *mcodebegin, *mcodeend, *mcoderestart;
112 } threadcritnode;
113
114 void thread_registercritical(threadcritnode *);
115 u1 *thread_checkcritical(u1*);
116
117 extern volatile int stopworldwhere;
118
119 void cast_stopworld();
120 void cast_startworld();
121
122 #endif /* _NATIVETHREAD_H */
123