2005-10-11 Dick Porter <dick@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         GSList *apc_queue;
55 } TimedThread;
56
57 typedef struct
58 {
59         guint32 (*callback)(gpointer arg);
60         gpointer param;
61 } ApcInfo;
62
63 extern void _wapi_timed_thread_exit(guint32 exitstatus) G_GNUC_NORETURN;
64 extern int _wapi_timed_thread_create(TimedThread **threadp,
65                                      const pthread_attr_t *attr,
66                                      guint32 create_flags,
67                                      guint32 (*start_routine)(gpointer),
68                                      void (*exit_routine)(guint32, gpointer),
69                                      gpointer arg, gpointer exit_userdata);
70 extern int _wapi_timed_thread_attach(TimedThread **threadp,
71                                      void (*exit_routine)(guint32, gpointer),
72                                      gpointer exit_userdata);
73 extern int _wapi_timed_thread_join(TimedThread *thread,
74                                    struct timespec *timeout,
75                                    guint32 *exitstatus);
76 extern void _wapi_timed_thread_destroy (TimedThread *thread);
77 extern void _wapi_timed_thread_suspend (TimedThread *thread);
78 extern void _wapi_timed_thread_resume (TimedThread *thread);
79                                    
80 extern void _wapi_timed_thread_queue_apc (TimedThread *thread, 
81                                         guint32 (*apc_callback)(gpointer), gpointer param);
82 extern gboolean _wapi_timed_thread_apc_pending (TimedThread *thread);
83 extern void _wapi_timed_thread_dispatch_apc_queue (TimedThread *thread);
84                    
85
86 #endif /* _WAPI_TIMED_THREAD_H_ */