* src/threads/posix/thread-posix.hpp (toolbox/list.h): Removed.
[cacao.git] / src / threads / posix / thread-posix.hpp
1 /* src/threads/posix/thread-posix.hpp - POSIX thread functions
2
3    Copyright (C) 1996-2005, 2006, 2007, 2008
4    CACAOVM - Verein zur Foerderung der freien virtuellen Maschine CACAO
5
6    This file is part of CACAO.
7
8    This program is free software; you can redistribute it and/or
9    modify it under the terms of the GNU General Public License as
10    published by the Free Software Foundation; either version 2, or (at
11    your option) any later version.
12
13    This program is distributed in the hope that it will be useful, but
14    WITHOUT ANY WARRANTY; without even the implied warranty of
15    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
16    General Public License for more details.
17
18    You should have received a copy of the GNU General Public License
19    along with this program; if not, write to the Free Software
20    Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
21    02110-1301, USA.
22
23 */
24
25
26 #ifndef _THREAD_POSIX_HPP
27 #define _THREAD_POSIX_HPP
28
29 #include "config.h"
30
31 #include <pthread.h>
32 #include <ucontext.h>
33
34 #include "vm/types.h"
35
36
37 // Includes required by Thread.
38
39 #if defined(ENABLE_TLH)
40 # include "mm/tlh.h"
41 #endif
42
43 #include "threads/condition.hpp"
44 #include "threads/mutex.hpp"
45
46 #include "vm/global.h"
47
48
49 /* threadobject ****************************************************************
50
51    Struct holding thread local variables.
52
53 *******************************************************************************/
54
55 #define THREAD_FLAG_JAVA        0x01    /* a normal Java thread               */
56 #define THREAD_FLAG_INTERNAL    0x02    /* CACAO internal thread              */
57 #define THREAD_FLAG_DAEMON      0x04    /* daemon thread                      */
58 #define THREAD_FLAG_IN_NATIVE   0x08    /* currently executing native code    */
59
60 #define SUSPEND_REASON_JNI       1      /* suspended from JNI                 */
61 #define SUSPEND_REASON_STOPWORLD 2      /* suspended from stop-thw-world      */
62
63
64 typedef struct threadobject threadobject;
65
66 struct threadobject {
67         java_object_t        *object;       /* link to java.lang.Thread object    */
68
69         ptrint                thinlock;     /* pre-computed thin lock value       */
70
71         s4                    index;        /* thread index, starting with 1      */
72         u4                    flags;        /* flag field                         */
73         u4                    state;        /* state field                        */
74
75         pthread_t             tid;          /* pthread id                         */
76
77 #if defined(__DARWIN__)
78         mach_port_t           mach_thread;       /* Darwin thread id              */
79 #endif
80
81         /* for the sable tasuki lock extension */
82         bool                  flc_bit;
83         struct threadobject  *flc_list;     /* FLC list head for this thread      */
84         struct threadobject  *flc_next;     /* next pointer for FLC list          */
85         java_handle_t        *flc_object;
86         Mutex*                flc_lock;     /* controlling access to these fields */
87         Condition*            flc_cond;
88
89         /* these are used for the wait/notify implementation                      */
90         Mutex*                waitmutex;
91         Condition*            waitcond;
92
93         Mutex*                suspendmutex; /* lock before suspending this thread */
94         Condition*            suspendcond;  /* notify to resume this thread       */
95
96         bool                  interrupted;
97         bool                  signaled;
98
99         bool                  suspended;    /* is this thread suspended?          */
100         s4                    suspend_reason; /* reason for suspending            */
101
102         u1                   *pc;           /* current PC (used for profiling)    */
103
104         java_object_t        *_exceptionptr;     /* current exception             */
105         struct stackframeinfo_t     *_stackframeinfo;   /* current native stackframeinfo */
106         struct localref_table       *_localref_table;   /* JNI local references          */
107
108 #if defined(ENABLE_INTRP)
109         Cell                 *_global_sp;        /* stack pointer for interpreter */
110 #endif
111
112 #if defined(ENABLE_GC_CACAO)
113         bool                  gc_critical;  /* indicates a critical section       */
114
115         sourcestate_t        *ss;
116         executionstate_t     *es;
117 #endif
118
119         struct DumpMemory*    _dumpmemory;     ///< Dump memory structure.
120
121 #if defined(ENABLE_DEBUG_FILTER)
122         u2                    filterverbosecallctr[2]; /* counters for verbose call filter */
123 #endif
124
125 #if !defined(NDEBUG)
126         s4                    tracejavacallindent;
127         u4                    tracejavacallcount;
128 #endif
129
130 #if defined(ENABLE_TLH)
131         tlh_t                 tlh;
132 #endif
133
134 #if defined(ENABLE_ESCAPE_REASON)
135         void *escape_reasons;
136 #endif
137 };
138
139
140 /* current threadobject *******************************************************/
141
142 #if defined(HAVE___THREAD)
143
144 #define THREADOBJECT      thread_current
145
146 extern __thread threadobject *thread_current;
147
148 #else /* defined(HAVE___THREAD) */
149
150 #define THREADOBJECT \
151         ((threadobject *) pthread_getspecific(thread_current_key))
152
153 extern pthread_key_t thread_current_key;
154
155 #endif /* defined(HAVE___THREAD) */
156
157
158 /* native-world flags *********************************************************/
159
160 #if defined(ENABLE_GC_CACAO)
161 # define THREAD_NATIVEWORLD_ENTER THREADOBJECT->flags |=  THREAD_FLAG_IN_NATIVE
162 # define THREAD_NATIVEWORLD_EXIT  THREADOBJECT->flags &= ~THREAD_FLAG_IN_NATIVE
163 #else
164 # define THREAD_NATIVEWORLD_ENTER /*nop*/
165 # define THREAD_NATIVEWORLD_EXIT  /*nop*/
166 #endif
167
168
169 /* counter for verbose call filter ********************************************/
170
171 #if defined(ENABLE_DEBUG_FILTER)
172 #       define FILTERVERBOSECALLCTR (THREADOBJECT->filterverbosecallctr)
173 #endif
174
175 /* state for trace java call **************************************************/
176
177 #if !defined(NDEBUG)
178 #       define TRACEJAVACALLINDENT (THREADOBJECT->tracejavacallindent)
179 #       define TRACEJAVACALLCOUNT (THREADOBJECT->tracejavacallcount)
180 #endif
181
182
183 // FIXME
184 #ifdef __cplusplus
185 extern "C" {
186 #endif
187 inline static threadobject* thread_get_current(void);
188 #ifdef __cplusplus
189 }
190 #endif
191
192
193 // Includes.
194 #include "mm/memory.h"
195
196 #include "native/localref.h"
197
198 #include "threads/posix/lock.h"
199
200 #include "vm/global.h"
201 #include "vm/vm.hpp"
202
203 #if defined(ENABLE_GC_CACAO)
204 # include "vm/jit/executionstate.h"
205 # include "vm/jit/replace.hpp"
206 #endif
207
208 #include "vm/jit/stacktrace.hpp"
209
210 #if defined(ENABLE_INTRP)
211 #include "vm/jit/intrp/intrp.h"
212 #endif
213
214 #if defined(__DARWIN__)
215 # include <mach/mach.h>
216
217 typedef struct {
218         Mutex* mutex;
219         Condition* cond;
220         int value;
221 } sem_t;
222
223 #else
224 # include <semaphore.h>
225 #endif
226
227
228 // FIXME
229 #ifdef __cplusplus
230 extern "C" {
231 #endif
232
233 /* inline functions ***********************************************************/
234
235 /**
236  * Return the Thread object of the current thread.
237  *
238  * @return The current Thread object.
239  */
240 inline static threadobject* thread_get_current(void)
241 {
242         threadobject *t;
243
244 #if defined(HAVE___THREAD)
245         t = thread_current;
246 #else
247         t = (threadobject *) pthread_getspecific(thread_current_key);
248 #endif
249
250         return t;
251 }
252
253
254 /**
255  * Set the current Thread object.
256  *
257  * @param t The thread object to set.
258  */
259 inline static void thread_set_current(threadobject* t)
260 {
261 #if defined(HAVE___THREAD)
262         thread_current = t;
263 #else
264         int result;
265
266         result = pthread_setspecific(thread_current_key, t);
267
268         if (result != 0)
269                 vm_abort_errnum(result, "thread_set_current: pthread_setspecific failed");
270 #endif
271 }
272
273
274 inline static stackframeinfo_t *threads_get_current_stackframeinfo(void)
275 {
276         return THREADOBJECT->_stackframeinfo;
277 }
278
279 inline static void threads_set_current_stackframeinfo(stackframeinfo_t *sfi)
280 {
281         THREADOBJECT->_stackframeinfo = sfi;
282 }
283
284
285 /* functions ******************************************************************/
286
287 void threads_sem_init(sem_t *sem, bool shared, int value);
288 void threads_sem_wait(sem_t *sem);
289 void threads_sem_post(sem_t *sem);
290
291 void threads_start_thread(threadobject *thread, functionptr function);
292
293 void threads_set_thread_priority(pthread_t tid, int priority);
294
295 #if defined(ENABLE_GC_CACAO)
296 bool threads_suspend_thread(threadobject *thread, s4 reason);
297 void threads_suspend_ack(u1* pc, u1* sp);
298 bool threads_resume_thread(threadobject *thread);
299 #endif
300
301 void threads_join_all_threads(void);
302
303 void threads_sleep(int64_t millis, int32_t nanos);
304
305 void threads_wait_with_timeout_relative(threadobject *t, s8 millis, s4 nanos);
306
307 void threads_thread_interrupt(threadobject *thread);
308
309 #if defined(ENABLE_TLH)
310 void threads_tlh_add_frame();
311 void threads_tlh_remove_frame();
312 #endif
313
314 #ifdef __cplusplus
315 } // extern "C"
316 #endif
317
318 #endif // _THREAD_POSIX_HPP
319
320
321 /*
322  * These are local overrides for various environment variables in Emacs.
323  * Please do not remove this and leave it at the end of the file, where
324  * Emacs will automagically detect them.
325  * ---------------------------------------------------------------------
326  * Local variables:
327  * mode: c++
328  * indent-tabs-mode: t
329  * c-basic-offset: 4
330  * tab-width: 4
331  * End:
332  * vim:noexpandtab:sw=4:ts=4:
333  */