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:
deischen 2001-05-04 20:37:07 +00:00
parent 93df24d8ed
commit c6f06e4f28
6 changed files with 54 additions and 18 deletions

View File

@ -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);
}
}
/*

View File

@ -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:
*/

View File

@ -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);
}
}
/*

View File

@ -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:
*/

View File

@ -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);
}
}
/*

View File

@ -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:
*/