2004-01-07 Martin Baulig <martin@ximian.com>
[mono.git] / mono / io-layer / timed-thread.h
1 /*
2  * timed-thread.h:  Implementation of timed thread joining
3  *
4  * Author:
5  *      Dick Porter (dick@ximian.com)
6  *
7  * (C) 2002 Ximian, Inc.
8  */
9
10 #ifndef _WAPI_TIMED_THREAD_H_
11 #define _WAPI_TIMED_THREAD_H_
12
13 #include <config.h>
14 #include <glib.h>
15 #include <pthread.h>
16 #ifdef HAVE_SEMAPHORE_H
17 #include <semaphore.h>
18 #endif
19 #ifdef USE_MACH_SEMA
20 #include <mach/mach_init.h>
21 #include <mach/task.h>
22 #include <mach/semaphore.h>
23 typedef semaphore_t MonoSemType;
24 #define MONO_SEM_INIT(addr,value) semaphore_create(current_task(), (addr), SYNC_POLICY_FIFO, (value))
25 #define MONO_SEM_WAIT(sem) semaphore_wait(*(sem))
26 #define MONO_SEM_POST(sem) semaphore_signal(*(sem))
27 #define MONO_SEM_DESTROY(sem) semaphore_destroy(current_task(), *(sem))
28 #else
29 typedef sem_t MonoSemType;
30 #define MONO_SEM_INIT(addr,value) sem_init ((addr), 0, (value))
31 #define MONO_SEM_WAIT(sem) sem_wait((sem))
32 #define MONO_SEM_POST(sem) sem_post((sem))
33 #define MONO_SEM_DESTROY(sem) sem_destroy((sem))
34 #endif
35
36 #include "mono-mutex.h"
37
38 typedef struct
39 {
40         pthread_t id;
41         mono_mutex_t join_mutex;
42         pthread_cond_t exit_cond;
43         guint32 create_flags;
44         int suspend_count;
45         MonoSemType suspend_sem;
46         MonoSemType suspended_sem;
47         guint32 (*start_routine)(gpointer arg);
48         void (*exit_routine)(guint32 exitstatus, gpointer userdata);
49         gpointer arg;
50         gpointer exit_userdata;
51         guint32 exitstatus;
52         gboolean exiting;
53         gpointer stack_ptr;
54 } TimedThread;
55
56 extern void _wapi_timed_thread_exit(guint32 exitstatus) G_GNUC_NORETURN;
57 extern int _wapi_timed_thread_create(TimedThread **threadp,
58                                      const pthread_attr_t *attr,
59                                      guint32 create_flags,
60                                      guint32 (*start_routine)(gpointer),
61                                      void (*exit_routine)(guint32, gpointer),
62                                      gpointer arg, gpointer exit_userdata);
63 extern int _wapi_timed_thread_attach(TimedThread **threadp,
64                                      void (*exit_routine)(guint32, gpointer),
65                                      gpointer exit_userdata);
66 extern int _wapi_timed_thread_join(TimedThread *thread,
67                                    struct timespec *timeout,
68                                    guint32 *exitstatus);
69 extern void _wapi_timed_thread_destroy (TimedThread *thread);
70 extern void _wapi_timed_thread_suspend (TimedThread *thread);
71 extern void _wapi_timed_thread_resume (TimedThread *thread);
72
73 #endif /* _WAPI_TIMED_THREAD_H_ */