Date: Fri, 9 Jul 1999 08:42:03 -0700 (PDT) From: jin@george.lbl.gov To: j_guojun@lbl.gov, nate@mt.sri.com Cc: freebsd-bugs@FreeBSD.ORG Subject: Re: kern/11984: pthread_kill cannot kill select() threads, etc. Message-ID: <199907091542.IAA04652@george.lbl.gov>
next in thread | raw e-mail | index | archive | help
} > Subject: Re: kern/11984: pthread_kill cannot kill select() threads, etc.
} > Date: Thu, 08 Jul 1999 12:46:56 -0700
}
} Note, according the PR, you are running:
}
} >Release: FreeBSD 3.2-RELEASE i386
}
} >
} > By tracing downto c_r library, two problems have been found:
} >
} > (1) pthread_exit(void *status)
} > {
} > int sig;
} > long l;
} > pthread_t pthread;
} >
} > /* Check if this thread is already in the process of exiting: */
} > if ((_thread_run->flags & PTHREAD_EXITING) != 0) {
} > char msg[128];
} > snprintf(msg,"Thread %p has called pthread_exit() from a destruc
} tor.
} > POSIX 1003.1 1996 s16.2.5.2 does not allow this!",_thread_run);
} > PANIC(msg);
} > }
} >
} > /* Flag this thread as exiting: */
} > _thread_run->flags |= PTHREAD_EXITING;
} > ...
} > }
} >
} > PTHREAD_EXITING is defined as 0x100, but _thread_run->flags is type of
} > char.
} >
} > So, PTHREAD_EXITING can never be checked or set.
}
} Huh? From 3.2-stable (which is the same as 3.2R), pthread_private.h
}
} SCLASS struct pthread * volatile _thread_run
}
} struct pthread {
} ....
} /* Miscellaneous data. */
} int flags;
} #define PTHREAD_FLAGS_PRIVATE 0x0001
} #define PTHREAD_EXITING 0x0002
} #define PTHREAD_FLAGS_QUEUED 0x0004 /* in queue (qe is used) */
} #define PTHREAD_FLAGS_TRACE 0x0008
}
} And, from current:
} SCLASS struct pthread * volatile _thread_run
}
} struct pthread {
} .....
} /* Miscellaneous data. */
} int flags;
} #define PTHREAD_FLAGS_PRIVATE 0x0001
} #define PTHREAD_EXITING 0x0002
} #define PTHREAD_FLAGS_IN_CONDQ 0x0004 /* in condition queue using qe link*/
} #define PTHREAD_FLAGS_IN_WORKQ 0x0008 /* in work queue using qe link */
} #define PTHREAD_FLAGS_IN_WAITQ 0x0010 /* in waiting queue using pqe link*/
} #define PTHREAD_FLAGS_IN_PRIOQ 0x0020 /* in priority queue using pqe link*/
} #define PTHREAD_FLAGS_TRACE 0x0040 /* for debugging purposes */
}
} flags and PTHREAD_EXITING are different that what you claim.
}
} Which version of FreeBSD are you using? In 3.0, it was a char, so I'll
} bet you are using a buggy version of the library. Please update to a
} more recent version, which has these bugs fixed.
Sorry for the confusion. That was in 2.2.8-RELEASE. The problem is the
gdb get core dump under 3.2-RELEASE when attach the hanging process,
so I did debugging under 2.2.8-RELEASE.
Yes, part of the problem 1 is fixed in 3.2-RELEASE, but the flags is not
checked any where, which causes problem 2 still in 3.2.
} As far as the second issue, I suspect (but did not review the code) that
} the error may be fixed in more recent versions of the code, which have
} had substantial changes since 3.0R. (Even 3.1R has most of the fixes in
} place.)
}
}
} Nate
I will look into the latest SNAP, but I doubt it is fixed. The entire idea
is still there. That is, the GC is still waiting for PS_DEAD thread to do
cond_signal. Since part of the problem (1) is improved, so we can check
further on the (flags & PTHREAD_EXITING) before doing cond_waiting on each
PS_DEAD thread, and everything should work.
If you agree this logic, I will examine the code and add this conditional
code to fix the problem.
If you think there may be other problems, we can discuss on it.
Thanks,
-Jin
To Unsubscribe: send mail to majordomo@FreeBSD.org
with "unsubscribe freebsd-bugs" in the body of the message
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?199907091542.IAA04652>
