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); |