summaryrefslogtreecommitdiffstats
path: root/lib/libc_r
diff options
context:
space:
mode:
authordeischen <deischen@FreeBSD.org>2000-11-20 13:12:44 +0000
committerdeischen <deischen@FreeBSD.org>2000-11-20 13:12:44 +0000
commit400a63d9371bc2cbcaf8f96471830a389a432ae3 (patch)
tree2b6d687d1e4ab220fa896697275b5851f641d9e1 /lib/libc_r
parent0f4c6ea8edac75412418c6978b7b2c208cff6798 (diff)
downloadFreeBSD-src-400a63d9371bc2cbcaf8f96471830a389a432ae3.zip
FreeBSD-src-400a63d9371bc2cbcaf8f96471830a389a432ae3.tar.gz
Change a "while {}" loop to a "do {} while" to allow it to be
executed at least once, fixing pthread_mutex_lock() for recursive mutex lock attempts. Correctly set a threads signal mask while it is executing a signal handler. The mask should be the union of its current mask, the signal being handled, and the mask from the signal action. Reported by: Dan Nelson <dnelson@emsphone.com> MFC Candidate
Diffstat (limited to 'lib/libc_r')
-rw-r--r--lib/libc_r/uthread/uthread_mutex.c6
-rw-r--r--lib/libc_r/uthread/uthread_sig.c4
2 files changed, 7 insertions, 3 deletions
diff --git a/lib/libc_r/uthread/uthread_mutex.c b/lib/libc_r/uthread/uthread_mutex.c
index f3649db..e0ad7da 100644
--- a/lib/libc_r/uthread/uthread_mutex.c
+++ b/lib/libc_r/uthread/uthread_mutex.c
@@ -427,8 +427,7 @@ pthread_mutex_lock(pthread_mutex_t * mutex)
* Instead, the thread is interrupted and backed out of the
* waiting queue prior to executing the signal handler.
*/
- while (((*mutex)->m_owner != _thread_run) && (ret == 0) &&
- (_thread_run->interrupted == 0)) {
+ do {
/*
* Defer signals to protect the scheduling queues from
* access by the signal handler:
@@ -637,7 +636,8 @@ pthread_mutex_lock(pthread_mutex_t * mutex)
* necessary:
*/
_thread_kern_sig_undefer();
- }
+ } while (((*mutex)->m_owner != _thread_run) && (ret == 0) &&
+ (_thread_run->interrupted == 0));
if (_thread_run->interrupted != 0 &&
_thread_run->continuation != NULL)
diff --git a/lib/libc_r/uthread/uthread_sig.c b/lib/libc_r/uthread/uthread_sig.c
index 3ac9740..a855a61 100644
--- a/lib/libc_r/uthread/uthread_sig.c
+++ b/lib/libc_r/uthread/uthread_sig.c
@@ -1057,6 +1057,10 @@ thread_sigframe_add(pthread_t thread, int sig, int has_args)
sizeof(psf->siginfo));
}
+ /* Setup the signal mask: */
+ SIGSETOR(thread->sigmask, _thread_sigact[sig - 1].sa_mask);
+ sigaddset(&thread->sigmask, sig);
+
/* Set up the new frame: */
thread->curframe = psf;
thread->ctxtype = CTX_JB_NOSIG;
OpenPOWER on IntegriCloud