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