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
This commit is contained in:
parent
93df24d8ed
commit
c6f06e4f28
@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
|
@ -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:
|
||||
*/
|
||||
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
|
@ -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:
|
||||
*/
|
||||
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
|
@ -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:
|
||||
*/
|
||||
|
Loading…
x
Reference in New Issue
Block a user