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