4 #include <minix/config.h> /* MUST be first */
5 #include <minix/const.h>
12 #include <sys/signal.h>
14 typedef int mthread_thread_t
;
15 typedef int mthread_once_t
;
16 typedef int mthread_key_t
;
17 typedef void * mthread_condattr_t
;
18 typedef void * mthread_mutexattr_t
;
22 struct __mthread_tcb
*mq_head
;
23 struct __mthread_tcb
*mq_tail
;
26 struct __mthread_mutex
{
27 mthread_queue_t mm_queue
; /* Queue of threads blocked on this mutex */
28 mthread_thread_t mm_owner
; /* Thread ID that currently owns mutex */
30 struct __mthread_mutex
*mm_prev
;
31 struct __mthread_mutex
*mm_next
;
33 unsigned int mm_magic
;
35 typedef struct __mthread_mutex
*mthread_mutex_t
;
37 struct __mthread_cond
{
38 struct __mthread_mutex
*mc_mutex
; /* Associate mutex with condition */
40 struct __mthread_cond
*mc_prev
;
41 struct __mthread_cond
*mc_next
;
43 unsigned int mc_magic
;
45 typedef struct __mthread_cond
*mthread_cond_t
;
47 struct __mthread_attr
{
51 struct __mthread_attr
*ma_prev
;
52 struct __mthread_attr
*ma_next
;
54 typedef struct __mthread_attr
*mthread_attr_t
;
57 mthread_mutex_t mutex
;
63 mthread_thread_t writer
;
64 mthread_mutex_t queue
;
65 mthread_event_t drain
;
68 #define MTHREAD_CREATE_JOINABLE 001
69 #define MTHREAD_CREATE_DETACHED 002
70 #define MTHREAD_ONCE_INIT 0
71 #define MTHREAD_STACK_MIN MINSIGSTKSZ
72 #define MTHREAD_KEYS_MAX 128
75 int mthread_create(mthread_thread_t
*thread
, mthread_attr_t
*tattr
, void
76 *(*proc
)(void *), void *arg
);
77 int mthread_detach(mthread_thread_t thread
);
78 int mthread_equal(mthread_thread_t l
, mthread_thread_t r
);
79 void mthread_exit(void *value
);
80 int mthread_join(mthread_thread_t thread
, void **value
);
81 int mthread_once(mthread_once_t
*once
, void (*proc
)(void));
82 mthread_thread_t
mthread_self(void);
85 int mthread_attr_destroy(mthread_attr_t
*tattr
);
86 int mthread_attr_getdetachstate(mthread_attr_t
*tattr
, int
88 int mthread_attr_getstack(mthread_attr_t
*tattr
, void **stackaddr
,
90 int mthread_attr_getstacksize(mthread_attr_t
*tattr
, size_t *stacksize
);
91 int mthread_attr_init(mthread_attr_t
*tattr
);
92 int mthread_attr_setdetachstate(mthread_attr_t
*tattr
, int detachstate
);
93 int mthread_attr_setstack(mthread_attr_t
*tattr
, void *stackaddr
, size_t
95 int mthread_attr_setstacksize(mthread_attr_t
*tattr
, size_t stacksize
);
99 int mthread_cond_broadcast(mthread_cond_t
*cond
);
100 int mthread_cond_destroy(mthread_cond_t
*cond
);
101 int mthread_cond_init(mthread_cond_t
*cond
, mthread_condattr_t
*cattr
);
102 int mthread_cond_signal(mthread_cond_t
*cond
);
103 int mthread_cond_wait(mthread_cond_t
*cond
, mthread_mutex_t
*mutex
);
106 int mthread_key_create(mthread_key_t
*key
, void (*destructor
)(void *));
107 int mthread_key_delete(mthread_key_t key
);
108 void *mthread_getspecific(mthread_key_t key
);
109 int mthread_setspecific(mthread_key_t key
, void *value
);
112 void mthread_stats(void);
113 void mthread_verify_f(char *f
, int l
);
114 #define mthread_verify() mthread_verify_f(__FILE__, __LINE__)
115 void mthread_stacktrace(mthread_thread_t t
);
116 void mthread_stacktraces(void);
119 int mthread_mutex_destroy(mthread_mutex_t
*mutex
);
120 int mthread_mutex_init(mthread_mutex_t
*mutex
, mthread_mutexattr_t
122 int mthread_mutex_lock(mthread_mutex_t
*mutex
);
123 int mthread_mutex_trylock(mthread_mutex_t
*mutex
);
124 int mthread_mutex_unlock(mthread_mutex_t
*mutex
);
127 int mthread_event_destroy(mthread_event_t
*event
);
128 int mthread_event_init(mthread_event_t
*event
);
129 int mthread_event_wait(mthread_event_t
*event
);
130 int mthread_event_fire(mthread_event_t
*event
);
131 int mthread_event_fire_all(mthread_event_t
*event
);
134 int mthread_rwlock_destroy(mthread_rwlock_t
*rwlock
);
135 int mthread_rwlock_init(mthread_rwlock_t
*rwlock
);
136 int mthread_rwlock_rdlock(mthread_rwlock_t
*rwlock
);
137 int mthread_rwlock_wrlock(mthread_rwlock_t
*rwlock
);
138 int mthread_rwlock_unlock(mthread_rwlock_t
*rwlock
);
141 void mthread_init(void);
142 int mthread_yield(void);
143 void mthread_yield_all(void);