| Index: fusl/src/thread/pthread_join.c
|
| diff --git a/fusl/src/thread/pthread_join.c b/fusl/src/thread/pthread_join.c
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..694d377ad486b834bf3c8453ed092ab684fd1fc9
|
| --- /dev/null
|
| +++ b/fusl/src/thread/pthread_join.c
|
| @@ -0,0 +1,22 @@
|
| +#include "pthread_impl.h"
|
| +#include <sys/mman.h>
|
| +
|
| +int __munmap(void *, size_t);
|
| +void __pthread_testcancel(void);
|
| +int __pthread_setcancelstate(int, int *);
|
| +
|
| +int __pthread_join(pthread_t t, void **res)
|
| +{
|
| + int tmp, cs;
|
| + __pthread_testcancel();
|
| + __pthread_setcancelstate(PTHREAD_CANCEL_DISABLE, &cs);
|
| + if (cs == PTHREAD_CANCEL_ENABLE) __pthread_setcancelstate(cs, 0);
|
| + while ((tmp = t->tid)) __timedwait_cp(&t->tid, tmp, 0, 0, 0);
|
| + __pthread_setcancelstate(cs, 0);
|
| + a_barrier();
|
| + if (res) *res = t->result;
|
| + if (t->map_base) __munmap(t->map_base, t->map_size);
|
| + return 0;
|
| +}
|
| +
|
| +weak_alias(__pthread_join, pthread_join);
|
|
|