OLD | NEW |
1 #include "pthread_impl.h" | 1 #include "pthread_impl.h" |
2 #include <sys/mman.h> | 2 #include <sys/mman.h> |
3 | 3 |
4 int __munmap(void *, size_t); | 4 int __munmap(void*, size_t); |
5 void __pthread_testcancel(void); | 5 void __pthread_testcancel(void); |
6 int __pthread_setcancelstate(int, int *); | 6 int __pthread_setcancelstate(int, int*); |
7 | 7 |
8 int __pthread_join(pthread_t t, void **res) | 8 int __pthread_join(pthread_t t, void** res) { |
9 { | 9 int tmp, cs; |
10 » int tmp, cs; | 10 __pthread_testcancel(); |
11 » __pthread_testcancel(); | 11 __pthread_setcancelstate(PTHREAD_CANCEL_DISABLE, &cs); |
12 » __pthread_setcancelstate(PTHREAD_CANCEL_DISABLE, &cs); | 12 if (cs == PTHREAD_CANCEL_ENABLE) |
13 » if (cs == PTHREAD_CANCEL_ENABLE) __pthread_setcancelstate(cs, 0); | 13 __pthread_setcancelstate(cs, 0); |
14 » while ((tmp = t->tid)) __timedwait_cp(&t->tid, tmp, 0, 0, 0); | 14 while ((tmp = t->tid)) |
15 » __pthread_setcancelstate(cs, 0); | 15 __timedwait_cp(&t->tid, tmp, 0, 0, 0); |
16 » a_barrier(); | 16 __pthread_setcancelstate(cs, 0); |
17 » if (res) *res = t->result; | 17 a_barrier(); |
18 » if (t->map_base) __munmap(t->map_base, t->map_size); | 18 if (res) |
19 » return 0; | 19 *res = t->result; |
| 20 if (t->map_base) |
| 21 __munmap(t->map_base, t->map_size); |
| 22 return 0; |
20 } | 23 } |
21 | 24 |
22 weak_alias(__pthread_join, pthread_join); | 25 weak_alias(__pthread_join, pthread_join); |
OLD | NEW |