summaryrefslogtreecommitdiffstats
path: root/lib/libpthread/thread
diff options
context:
space:
mode:
Diffstat (limited to 'lib/libpthread/thread')
-rw-r--r--lib/libpthread/thread/thr_kern.c21
-rw-r--r--lib/libpthread/thread/thr_sig.c3
2 files changed, 18 insertions, 6 deletions
diff --git a/lib/libpthread/thread/thr_kern.c b/lib/libpthread/thread/thr_kern.c
index 8a32253..9d317ed 100644
--- a/lib/libpthread/thread/thr_kern.c
+++ b/lib/libpthread/thread/thr_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/libpthread/thread/thr_sig.c b/lib/libpthread/thread/thr_sig.c
index 71a88ef..9ce53a0 100644
--- a/lib/libpthread/thread/thr_sig.c
+++ b/lib/libpthread/thread/thr_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