1 #include "pthread_impl.h"
4 static int __pthread_timedjoin_np(pthread_t t
, void **res
, const struct timespec
*at
)
7 __pthread_testcancel();
8 __pthread_setcancelstate(PTHREAD_CANCEL_DISABLE
, &cs
);
9 if (cs
== PTHREAD_CANCEL_ENABLE
) __pthread_setcancelstate(cs
, 0);
10 while ((state
= t
->detach_state
) && r
!= ETIMEDOUT
&& r
!= EINVAL
) {
11 if (state
>= DT_DETACHED
) a_crash();
12 r
= __timedwait_cp(&t
->detach_state
, state
, CLOCK_REALTIME
, at
, 0);
14 __pthread_setcancelstate(cs
, 0);
15 if (r
== ETIMEDOUT
|| r
== EINVAL
) return r
;
17 if (res
) *res
= t
->result
;
18 if (t
->map_base
) __munmap(t
->map_base
, t
->map_size
);
22 int __pthread_join(pthread_t t
, void **res
)
24 return __pthread_timedjoin_np(t
, res
, 0);
27 static int __pthread_tryjoin_np(pthread_t t
, void **res
)
29 return t
->detach_state
==DT_JOINABLE
? EBUSY
: __pthread_join(t
, res
);
32 weak_alias(__pthread_tryjoin_np
, pthread_tryjoin_np
);
33 weak_alias(__pthread_timedjoin_np
, pthread_timedjoin_np
);
34 weak_alias(__pthread_join
, pthread_join
);