summaryrefslogtreecommitdiffstats
path: root/lib/libc_r
diff options
context:
space:
mode:
authordeischen <deischen@FreeBSD.org>2001-05-04 20:37:07 +0000
committerdeischen <deischen@FreeBSD.org>2001-05-04 20:37:07 +0000
commitc6f06e4f2802a45e7ecdc92f8621482e5583a198 (patch)
tree0f768b156572034b259a3baca23e98420ff91a04 /lib/libc_r
parent93df24d8ed29249a70aeb5f88e8af2f3fa552f20 (diff)
downloadFreeBSD-src-c6f06e4f2802a45e7ecdc92f8621482e5583a198.zip
FreeBSD-src-c6f06e4f2802a45e7ecdc92f8621482e5583a198.tar.gz
Move the check for a pending signals to after the thread has been
placed in any scheduling queue(s). The process of dispatching signals to a thread can change its state which will attempt to add or remove the thread from any scheduling queue to which it belongs. This can break some assertions if the thread isn't in the queue(s) implied by its state. When adding dispatching a pending signal to a thread, be sure to remove the signal from the threads set of pending signals. PR: 27035 Tested by: brian MFC in: 1 week
Diffstat (limited to 'lib/libc_r')
-rw-r--r--lib/libc_r/uthread/uthread_kern.c21
-rw-r--r--lib/libc_r/uthread/uthread_sig.c3
2 files changed, 18 insertions, 6 deletions
diff --git a/lib/libc_r/uthread/uthread_kern.c b/lib/libc_r/uthread/uthread_kern.c
index 8a32253..9d317ed 100644
--- a/lib/libc_r/uthread/uthread_kern.c
+++ b/lib/libc_r/uthread/uthread_kern.c
@@ -206,12 +206,6 @@ _thread_kern_scheduler(void)
PANIC("Unable to restore alternate signal stack");
}
- /* Are there pending signals for this thread? */
- if (curthread->check_pending != 0) {
- curthread->check_pending = 0;
- _thread_sig_check_pending(curthread);
- }
-
/*
* Enter a scheduling loop that finds the next thread that is
* ready to run. This loop completes when there are no more threads
@@ -335,6 +329,21 @@ _thread_kern_scheduler(void)
PTHREAD_WORKQ_INSERT(curthread);
break;
}
+
+ /*
+ * Are there pending signals for this thread?
+ *
+ * This check has to be performed after the thread
+ * has been placed in the queue(s) appropriate for
+ * its state. The process of adding pending signals
+ * can change a threads state, which in turn will
+ * attempt to add or remove the thread from any
+ * scheduling queue to which it belongs.
+ */
+ if (curthread->check_pending != 0) {
+ curthread->check_pending = 0;
+ _thread_sig_check_pending(curthread);
+ }
}
/*
diff --git a/lib/libc_r/uthread/uthread_sig.c b/lib/libc_r/uthread/uthread_sig.c
index 71a88ef..9ce53a0 100644
--- a/lib/libc_r/uthread/uthread_sig.c
+++ b/lib/libc_r/uthread/uthread_sig.c
@@ -575,6 +575,9 @@ thread_sig_add(pthread_t pthread, int sig, int has_args)
restart = _thread_sigact[sig - 1].sa_flags & SA_RESTART;
+ /* Make sure this signal isn't still in the pending set: */
+ sigdelset(&pthread->sigpend, sig);
+
/*
* Process according to thread state:
*/
OpenPOWER on IntegriCloud