Page MenuHomeFreeBSD

D54766.diff
No OneTemporary

D54766.diff

diff --git a/lib/libthr/thread/thr_join.c b/lib/libthr/thread/thr_join.c
--- a/lib/libthr/thread/thr_join.c
+++ b/lib/libthr/thread/thr_join.c
@@ -43,16 +43,23 @@
__weak_reference(_pthread_timedjoin_np, pthread_timedjoin_np);
__weak_reference(_pthread_peekjoin_np, pthread_peekjoin_np);
-static void backout_join(void *arg)
+static void
+backout_join(struct pthread *pthread, struct pthread *curthread)
{
- struct pthread *pthread = (struct pthread *)arg;
- struct pthread *curthread = _get_curthread();
-
THR_THREAD_LOCK(curthread, pthread);
pthread->joiner = NULL;
THR_THREAD_UNLOCK(curthread, pthread);
}
+static void
+backout_join_pop(void *arg)
+{
+ struct pthread *pthread = (struct pthread *)arg;
+ struct pthread *curthread = _get_curthread();
+
+ backout_join(pthread, curthread);
+}
+
int
_thr_join(pthread_t pthread, void **thread_return)
{
@@ -149,10 +156,8 @@
_thr_cancel_leave(curthread, 0);
THR_CLEANUP_POP(curthread, 0);
- if (ret == ETIMEDOUT) {
- THR_THREAD_LOCK(curthread, pthread);
- pthread->joiner = NULL;
- THR_THREAD_UNLOCK(curthread, pthread);
+ if (ret == ETIMEDOUT || ret == EBUSY) {
+ backout_join(pthread, curthread);
} else {
ret = 0;
tmp = pthread->ret;

File Metadata

Mime Type
text/plain
Expires
Fri, Mar 13, 5:33 PM (1 h, 16 m)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
27766123
Default Alt Text
D54766.diff (1 KB)

Event Timeline