1
0
mirror of https://sourceware.org/git/glibc.git synced 2025-07-29 11:41:21 +03:00

Thu Jun 6 16:12:39 1996 Roland McGrath <roland@delasyd.gnu.ai.mit.edu>

* hurd/hurdsig.c (_hurd_internal_post_signal): For SIGNO==0 pending
	check, deliver a pending blocked signal if its action might be to
	ignore.
	* sysdeps/mach/hurd/sigaction.c: If new action is SIG_IGN or SIG_DFL
	and SIG is pending, wake up signal thread to check us.

	* hurd/hurdsig.c (_hurd_internal_post_signal): Don't mark a signal
	pending while blocked or stopped when the action is to ignore it.

	* hurd/hurdsig.c (_hurd_internal_post_signal: resume): Only set
	SS_SUSPENDED when the thread is really suspended.

	* elf/rtld.c (dl_main): Don't dereference _dl_rtld_map.l_next if null.
This commit is contained in:
Roland McGrath
1996-06-06 20:49:22 +00:00
parent e60062b769
commit 4d02a5b18a
4 changed files with 50 additions and 17 deletions

View File

@ -516,8 +516,9 @@ _hurd_internal_post_signal (struct hurd_sigstate *ss,
(vm_address_t) threads,
nthreads * sizeof *threads);
_hurd_stopped = 0;
/* The thread that will run the handler is already suspended. */
ss_suspended = 1;
if (act == handle)
/* The thread that will run the handler is already suspended. */
ss_suspended = 1;
}
if (signo == 0)
@ -673,19 +674,11 @@ _hurd_internal_post_signal (struct hurd_sigstate *ss,
}
/* Handle receipt of a blocked signal, or any signal while stopped. */
if (__sigismember (&ss->blocked, signo) ||
if (act != ignore && /* Signals ignored now are forgotten now. */
__sigismember (&ss->blocked, signo) ||
(signo != SIGKILL && _hurd_stopped))
{
mark_pending ();
/* If there was a call to resume above in SIGCONT processing
and we've left a thread suspended, now's the time to
set it going. */
if (ss_suspended)
{
err = __thread_resume (ss->thread);
assert_perror (err);
ss_suspended = 0;
}
act = ignore;
}
@ -708,7 +701,15 @@ _hurd_internal_post_signal (struct hurd_sigstate *ss,
break;
case ignore:
/* Nobody cares about this signal. */
/* Nobody cares about this signal. If there was a call to resume
above in SIGCONT processing and we've left a thread suspended,
now's the time to set it going. */
if (ss_suspended)
{
err = __thread_resume (ss->thread);
assert_perror (err);
ss_suspended = 0;
}
break;
sigbomb:
@ -904,10 +905,10 @@ _hurd_internal_post_signal (struct hurd_sigstate *ss,
if (signals_pending ())
{
pending:
for (signo = 1; signo < NSIG; ++signo)
if (__sigismember (&pending, signo))
{
deliver:
__sigdelset (&ss->pending, signo);
*detail = ss->pending_data[signo];
__spin_unlock (&ss->lock);
@ -925,8 +926,15 @@ _hurd_internal_post_signal (struct hurd_sigstate *ss,
for (ss = _hurd_sigstates; ss != NULL; ss = ss->next)
{
__spin_lock (&ss->lock);
if (signals_pending ())
goto pending;
for (signo = 1; signo < NSIG; ++signo)
if (__sigismember (&ss->pending, signo) &&
!__sigismember (&ss->blocked, signo) ||
/* We "deliver" immediately pending blocked signals whose
action might be to ignore, so that if ignored they are
dropped right away. */
ss->actions[signo].sa_handler == SIG_IGN ||
ss->actions[signo].sa_handler == SIG_DFL)
goto deliver_pending;
__spin_unlock (&ss->lock);
}
__mutex_unlock (&_hurd_siglock);