1 #ifndef _NATIVETHREAD_H
2 #define _NATIVETHREAD_H
5 #include "nat/java_lang_Object.h"
6 #include "nat/java_lang_Throwable.h"
7 #include "nat/java_lang_Thread.h"
11 typedef struct monitorLockRecord {
12 struct _threadobject *owner;
15 struct monitorLockRecord *queue;
16 struct monitorLockRecord *nextFree;
19 struct _lockRecordPool;
22 struct _lockRecordPool *next;
24 } lockRecordPoolHeader;
26 typedef struct _lockRecordPool {
27 lockRecordPoolHeader header;
28 monitorLockRecord lr[1];
31 #define INITIALLOCKRECORDS 8
33 /* Monitor lock implementation */
35 pthread_mutex_t metaLockMutex;
36 pthread_cond_t metaLockCond;
40 struct _threadobject *succ;
41 pthread_mutex_t monitorLockMutex;
42 pthread_cond_t monitorLockCond;
43 bool isWaitingForNotify;
45 monitorLockRecord *firstLR;
46 monitorLockRecord lr[INITIALLOCKRECORDS];
47 lockRecordPool *lrpool;
51 struct _threadobject *next, *prev;
52 java_objectheader *_exceptionptr;
53 methodinfo *_threadrootmethod;
54 void *_stackframeinfo;
56 pthread_mutex_t joinMutex;
57 pthread_cond_t joinCond;
60 typedef struct _threadobject {
64 } threadobject, thread;
66 void monitorEnter(threadobject *, java_objectheader *);
67 void monitorExit(threadobject *, java_objectheader *);
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);
73 void initThreadsEarly();
74 void initThreads(u1 *stackbottom);
76 void initThread(java_lang_Thread *);
77 void joinAllThreads();
79 bool aliveThread(java_lang_Thread *);
80 void sleepThread (s8);
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)
88 extern __thread threadobject *threadobj;
89 #define THREADOBJECT ((java_lang_Thread*) threadobj)
90 #define THREADINFO (&threadobj->info)
95 /* This must not be changed, it is used in asm_criticalsections */
97 u1 *mcodebegin, *mcodeend, *mcoderestart;
100 void thread_registercritical(threadcritnode *);
101 u1 *thread_checkcritical(u1*);
103 extern volatile int stopworldwhere;
105 void cast_stopworld();
106 void cast_startworld();
108 #endif /* _NATIVETHREAD_H */