1 #ifndef _MTHREAD_H 2 #define _MTHREAD_H 3 4 #include <minix/config.h> /* MUST be first */ 5 #include <minix/const.h> 6 #include <sys/types.h> 7 #include <stdio.h> 8 #include <ucontext.h> 9 #include <errno.h> 10 #include <stdlib.h> 11 #include <limits.h> 12 #include <sys/signal.h> 13 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; 19 20 struct __mthread_tcb; 21 typedef struct { 22 struct __mthread_tcb *mq_head; 23 struct __mthread_tcb *mq_tail; 24 } mthread_queue_t; 25 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 */ 29 #ifdef MTHREAD_STRICT 30 struct __mthread_mutex *mm_prev; 31 struct __mthread_mutex *mm_next; 32 #endif 33 unsigned int mm_magic; 34 }; 35 typedef struct __mthread_mutex *mthread_mutex_t; 36 37 struct __mthread_cond { 38 struct __mthread_mutex *mc_mutex; /* Associate mutex with condition */ 39 #ifdef MTHREAD_STRICT 40 struct __mthread_cond *mc_prev; 41 struct __mthread_cond *mc_next; 42 #endif 43 unsigned int mc_magic; 44 }; 45 typedef struct __mthread_cond *mthread_cond_t; 46 47 struct __mthread_attr { 48 size_t ma_stacksize; 49 char *ma_stackaddr; 50 int ma_detachstate; 51 struct __mthread_attr *ma_prev; 52 struct __mthread_attr *ma_next; 53 }; 54 typedef struct __mthread_attr *mthread_attr_t; 55 56 typedef struct { 57 mthread_mutex_t mutex; 58 mthread_cond_t cond; 59 } mthread_event_t; 60 61 typedef struct { 62 unsigned int readers; 63 mthread_thread_t writer; 64 mthread_mutex_t queue; 65 mthread_event_t drain; 66 } mthread_rwlock_t; 67 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 73 74 __BEGIN_DECLS 75 /* allocate.c */ 76 int mthread_create(mthread_thread_t *thread, mthread_attr_t *tattr, void 77 *(*proc)(void *), void *arg); 78 int mthread_detach(mthread_thread_t thread); 79 int mthread_equal(mthread_thread_t l, mthread_thread_t r); 80 void mthread_exit(void *value); 81 int mthread_join(mthread_thread_t thread, void **value); 82 int mthread_once(mthread_once_t *once, void (*proc)(void)); 83 mthread_thread_t mthread_self(void); 84 85 /* attribute.c */ 86 int mthread_attr_destroy(mthread_attr_t *tattr); 87 int mthread_attr_getdetachstate(mthread_attr_t *tattr, int 88 *detachstate); 89 int mthread_attr_getstack(mthread_attr_t *tattr, void **stackaddr, 90 size_t *stacksize); 91 int mthread_attr_getstacksize(mthread_attr_t *tattr, size_t *stacksize); 92 int mthread_attr_init(mthread_attr_t *tattr); 93 int mthread_attr_setdetachstate(mthread_attr_t *tattr, int detachstate); 94 int mthread_attr_setstack(mthread_attr_t *tattr, void *stackaddr, size_t 95 stacksize); 96 int mthread_attr_setstacksize(mthread_attr_t *tattr, size_t stacksize); 97 98 99 /* condition.c */ 100 int mthread_cond_broadcast(mthread_cond_t *cond); 101 int mthread_cond_destroy(mthread_cond_t *cond); 102 int mthread_cond_init(mthread_cond_t *cond, mthread_condattr_t *cattr); 103 int mthread_cond_signal(mthread_cond_t *cond); 104 int mthread_cond_wait(mthread_cond_t *cond, mthread_mutex_t *mutex); 105 106 /* key.c */ 107 int mthread_key_create(mthread_key_t *key, void (*destructor)(void *)); 108 int mthread_key_delete(mthread_key_t key); 109 void *mthread_getspecific(mthread_key_t key); 110 int mthread_setspecific(mthread_key_t key, void *value); 111 112 /* misc.c */ 113 void mthread_stats(void); 114 void mthread_verify_f(char *f, int l); 115 #define mthread_verify() mthread_verify_f(__FILE__, __LINE__) 116 void mthread_stacktrace(mthread_thread_t t); 117 void mthread_stacktraces(void); 118 119 /* mutex.c */ 120 int mthread_mutex_destroy(mthread_mutex_t *mutex); 121 int mthread_mutex_init(mthread_mutex_t *mutex, mthread_mutexattr_t 122 *mattr); 123 int mthread_mutex_lock(mthread_mutex_t *mutex); 124 int mthread_mutex_trylock(mthread_mutex_t *mutex); 125 int mthread_mutex_unlock(mthread_mutex_t *mutex); 126 127 /* event.c */ 128 int mthread_event_destroy(mthread_event_t *event); 129 int mthread_event_init(mthread_event_t *event); 130 int mthread_event_wait(mthread_event_t *event); 131 int mthread_event_fire(mthread_event_t *event); 132 int mthread_event_fire_all(mthread_event_t *event); 133 134 /* rwlock.c */ 135 int mthread_rwlock_destroy(mthread_rwlock_t *rwlock); 136 int mthread_rwlock_init(mthread_rwlock_t *rwlock); 137 int mthread_rwlock_rdlock(mthread_rwlock_t *rwlock); 138 int mthread_rwlock_wrlock(mthread_rwlock_t *rwlock); 139 int mthread_rwlock_unlock(mthread_rwlock_t *rwlock); 140 141 /* schedule.c */ 142 int mthread_yield(void); 143 void mthread_yield_all(void); 144 __END_DECLS 145 146 #if defined(_MTHREADIFY_PTHREADS) 147 typedef mthread_thread_t pthread_t; 148 typedef mthread_once_t pthread_once_t; 149 typedef mthread_key_t pthread_key_t; 150 typedef mthread_cond_t pthread_cond_t; 151 typedef mthread_mutex_t pthread_mutex_t; 152 typedef mthread_condattr_t pthread_condattr_t; 153 typedef mthread_mutexattr_t pthread_mutexattr_t; 154 typedef mthread_attr_t pthread_attr_t; 155 typedef mthread_event_t pthread_event_t; 156 typedef mthread_rwlock_t pthread_rwlock_t; 157 158 /* LSC: No equivalent, so void* for now. */ 159 typedef void *pthread_rwlockattr_t; 160 161 #define PTHREAD_ONCE_INIT 0 162 #define PTHREAD_MUTEX_INITIALIZER ((pthread_mutex_t) -1) 163 #define PTHREAD_COND_INITIALIZER ((pthread_cond_t) -1) 164 165 __BEGIN_DECLS 166 /* allocate.c */ 167 int pthread_create(pthread_t *thread, pthread_attr_t *tattr, void 168 *(*proc)(void *), void *arg); 169 int pthread_detach(pthread_t thread); 170 int pthread_equal(pthread_t l, pthread_t r); 171 void pthread_exit(void *value); 172 int pthread_join(pthread_t thread, void **value); 173 int pthread_once(pthread_once_t *once, void (*proc)(void)); 174 pthread_t pthread_self(void); 175 176 /* attribute.c */ 177 int pthread_attr_destroy(pthread_attr_t *tattr); 178 int pthread_attr_getdetachstate(pthread_attr_t *tattr, int 179 *detachstate); 180 int pthread_attr_getstack(pthread_attr_t *tattr, void **stackaddr, 181 size_t *stacksize); 182 int pthread_attr_getstacksize(pthread_attr_t *tattr, size_t *stacksize); 183 int pthread_attr_init(pthread_attr_t *tattr); 184 int pthread_attr_setdetachstate(pthread_attr_t *tattr, int detachstate); 185 int pthread_attr_setstack(pthread_attr_t *tattr, void *stackaddr, size_t 186 stacksize); 187 int pthread_attr_setstacksize(pthread_attr_t *tattr, size_t stacksize); 188 189 /* condition.c */ 190 int pthread_cond_broadcast(pthread_cond_t *cond); 191 int pthread_cond_destroy(pthread_cond_t *cond); 192 int pthread_cond_init(pthread_cond_t *cond, pthread_condattr_t *cattr); 193 int pthread_cond_signal(pthread_cond_t *cond); 194 int pthread_cond_wait(pthread_cond_t *cond, pthread_mutex_t *mutex); 195 196 /* key.c */ 197 int pthread_key_create(pthread_key_t *key, void (*destructor)(void *)); 198 int pthread_key_delete(pthread_key_t key); 199 void *pthread_getspecific(pthread_key_t key); 200 int pthread_setspecific(pthread_key_t key, void *value); 201 202 /* mutex.c */ 203 int pthread_mutex_destroy(pthread_mutex_t *mutex); 204 int pthread_mutex_init(pthread_mutex_t *mutex, pthread_mutexattr_t 205 *mattr); 206 int pthread_mutex_lock(pthread_mutex_t *mutex); 207 int pthread_mutex_trylock(pthread_mutex_t *mutex); 208 int pthread_mutex_unlock(pthread_mutex_t *mutex); 209 210 /* event.c */ 211 int pthread_event_destroy(pthread_event_t *event); 212 int pthread_event_init(pthread_event_t *event); 213 int pthread_event_wait(pthread_event_t *event); 214 int pthread_event_fire(pthread_event_t *event); 215 int pthread_event_fire_all(pthread_event_t *event); 216 217 /* rwlock.c */ 218 int pthread_rwlock_destroy(pthread_rwlock_t *rwlock); 219 int pthread_rwlock_init(pthread_rwlock_t *rwlock, 220 pthread_rwlockattr_t *UNUSED(attr)); 221 int pthread_rwlock_rdlock(pthread_rwlock_t *rwlock); 222 int pthread_rwlock_wrlock(pthread_rwlock_t *rwlock); 223 int pthread_rwlock_unlock(pthread_rwlock_t *rwlock); 224 225 /* schedule.c */ 226 int pthread_yield(void); 227 int sched_yield(void); 228 void pthread_yield_all(void); 229 230 /* LSC: FIXME: Maybe we should really do something with those... */ 231 #define pthread_mutexattr_init(u) (0) 232 #define pthread_mutexattr_destroy(u) (0) 233 234 #define PTHREAD_MUTEX_RECURSIVE 0 235 #define pthread_mutexattr_settype(x, y) (EINVAL) 236 __END_DECLS 237 238 #endif /* defined(_MTHREADIFY_PTHREADS) */ 239 #endif 240