2 #include "pthread_impl.h"
5 static void dummy1(pthread_t t
)
8 weak_alias(dummy1
, __tl_sync
);
10 static int __pthread_timedjoin_np(pthread_t t
, void **res
, const struct timespec
*at
)
13 __pthread_testcancel();
14 __pthread_setcancelstate(PTHREAD_CANCEL_DISABLE
, &cs
);
15 if (cs
== PTHREAD_CANCEL_ENABLE
) __pthread_setcancelstate(cs
, 0);
16 while ((state
= t
->detach_state
) && r
!= ETIMEDOUT
&& r
!= EINVAL
) {
17 if (state
>= DT_DETACHED
) a_crash();
18 r
= __timedwait_cp(&t
->detach_state
, state
, CLOCK_REALTIME
, at
, 1);
20 __pthread_setcancelstate(cs
, 0);
21 if (r
== ETIMEDOUT
|| r
== EINVAL
) return r
;
23 if (res
) *res
= t
->result
;
24 if (t
->map_base
) __munmap(t
->map_base
, t
->map_size
);
28 int __pthread_join(pthread_t t
, void **res
)
30 return __pthread_timedjoin_np(t
, res
, 0);
33 static int __pthread_tryjoin_np(pthread_t t
, void **res
)
35 return t
->detach_state
==DT_JOINABLE
? EBUSY
: __pthread_join(t
, res
);
38 weak_alias(__pthread_tryjoin_np
, pthread_tryjoin_np
);
39 weak_alias(__pthread_timedjoin_np
, pthread_timedjoin_np
);
40 weak_alias(__pthread_join
, pthread_join
);