diff options
author | deischen <deischen@FreeBSD.org> | 2000-11-20 13:12:44 +0000 |
---|---|---|
committer | deischen <deischen@FreeBSD.org> | 2000-11-20 13:12:44 +0000 |
commit | 400a63d9371bc2cbcaf8f96471830a389a432ae3 (patch) | |
tree | 2b6d687d1e4ab220fa896697275b5851f641d9e1 /lib/libc_r | |
parent | 0f4c6ea8edac75412418c6978b7b2c208cff6798 (diff) | |
download | FreeBSD-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.c | 6 | ||||
-rw-r--r-- | lib/libc_r/uthread/uthread_sig.c | 4 |
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; |