2214f6a4f2bd1c97a8afc0f066d9b220f1d7d047
[cacao.git] / src / threads / native / threads.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
9 #if defined(__DARWIN__)
10 #include <mach/mach.h>
11
12 /* We need to emulate recursive mutexes. */
13 #define MUTEXSIM
14 #endif
15
16 struct _threadobject;
17
18 typedef struct monitorLockRecord {
19         struct _threadobject *owner;
20         int lockCount;
21         long storedBits;
22         struct monitorLockRecord *queue;
23         struct monitorLockRecord *nextFree;
24 } monitorLockRecord;
25
26 struct _lockRecordPool;
27
28 typedef struct {
29         struct _lockRecordPool *next;
30         int size;
31 } lockRecordPoolHeader; 
32
33 typedef struct _lockRecordPool {
34         lockRecordPoolHeader header;
35         monitorLockRecord lr[1];
36 } lockRecordPool;
37
38 #define INITIALLOCKRECORDS 8
39
40 /* Monitor lock implementation */
41 typedef struct {
42         pthread_mutex_t metaLockMutex;
43         pthread_cond_t metaLockCond;
44         bool gotMetaLockSlow;
45         bool bitsForGrab;
46         long metaLockBits;
47         struct _threadobject *succ;
48         pthread_mutex_t monitorLockMutex;
49         pthread_cond_t monitorLockCond;
50         bool isWaitingForNotify;
51
52         monitorLockRecord *firstLR;
53         monitorLockRecord lr[INITIALLOCKRECORDS];
54         lockRecordPool *lrpool;
55 } ExecEnvironment;
56
57 typedef struct {
58         struct _threadobject *next, *prev;
59         java_objectheader *_exceptionptr;
60         methodinfo *_threadrootmethod;
61         void *_stackframeinfo;
62         pthread_t tid;
63 #if defined(__DARWIN__)
64         mach_port_t mach_thread;
65 #endif
66         pthread_mutex_t joinMutex;
67         pthread_cond_t joinCond;
68 } nativethread;
69
70 typedef struct _threadobject {
71         java_lang_Thread o;
72         nativethread info;
73         ExecEnvironment ee;
74 } threadobject, thread;
75
76 void monitorEnter(threadobject *, java_objectheader *);
77 void monitorExit(threadobject *, java_objectheader *);
78
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);
82
83 void initThreadsEarly();
84 void initThreads(u1 *stackbottom);
85 void initLocks();
86 void initThread(java_lang_Thread *);
87 void joinAllThreads();
88
89 bool aliveThread(java_lang_Thread *);
90 void sleepThread(s8 millis, s4 nanos);
91 void yieldThread();
92
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)
97 #else
98 extern __thread threadobject *threadobj;
99 #define THREADOBJECT ((java_lang_Thread*) threadobj)
100 #define THREADINFO (&threadobj->info)
101 #endif
102
103 #include "builtin.h"
104
105 /* This must not be changed, it is used in asm_criticalsections */
106 typedef struct {
107         u1 *mcodebegin, *mcodeend, *mcoderestart;
108 } threadcritnode;
109
110 void thread_registercritical(threadcritnode *);
111 u1 *thread_checkcritical(u1*);
112
113 extern volatile int stopworldwhere;
114
115 void cast_stopworld();
116 void cast_startworld();
117
118 #endif /* _NATIVETHREAD_H */
119