From 93a470c71a236c6fbf4f2a207eb3961754187e80 Mon Sep 17 00:00:00 2001 From: Roland McGrath Date: Tue, 7 May 1996 14:57:38 +0000 Subject: Tue May 7 10:51:52 1996 Roland McGrath * wcsmbs/wcwidth.c, wcsmbs/wcswidth.c: Fixed typos. * sysdeps/unix/sysv/linux/sys/mman.h: Fixed typo. * sysdeps/stub/sched_getp.c: Add missing #include . * sysdeps/stub/sched_sets.c: Likewise. * sysdeps/stub/sched_setp.c: Likewise. * sysdeps/stub/sched_rr_gi.c: Likewise. * sysdeps/stub/sched_gets.c: Likewise. * hurd/hurdsig.c: Use struct hurd_signal_detail. * hurd/hurd/fd.h (_hurd_fd_error): Likewise. * sysdeps/mach/hurd/sysd-stdio.c (fd_fail): Likewise. --- hurd/hurd/fd.h | 10 +++++++--- hurd/hurd/signal.h | 41 ++++++++++++++++++++++++----------------- hurd/hurd/sigpreempt.h | 3 ++- hurd/hurdsig.c | 23 +++++++++++++++-------- 4 files changed, 48 insertions(+), 29 deletions(-) (limited to 'hurd') diff --git a/hurd/hurd/fd.h b/hurd/hurd/fd.h index 4747c78..b6402ea 100644 --- a/hurd/hurd/fd.h +++ b/hurd/hurd/fd.h @@ -1,5 +1,5 @@ /* File descriptors. -Copyright (C) 1993, 1994, 1995 Free Software Foundation, Inc. +Copyright (C) 1993, 1994, 1995, 1996 Free Software Foundation, Inc. This file is part of the GNU C Library. The GNU C Library is free software; you can redistribute it and/or @@ -153,14 +153,18 @@ _hurd_fd_error_signal (error_t err) /* Handle an error from an RPC on a file descriptor's port. You should always use this function to handle errors from RPCs made on file - descriptor ports. Some errors are translated into signals. */ + descriptor ports. Some errors are translated into signals. */ _EXTERN_INLINE error_t _hurd_fd_error (int fd, error_t err) { int signo = _hurd_fd_error_signal (err); if (signo) - _hurd_raise_signal (NULL, signo, fd, err); + { + const struct hurd_signal_detail detail + = { code: fd, error: err, exc: 0 }; + _hurd_raise_signal (NULL, signo, &detail); + } return err; } diff --git a/hurd/hurd/signal.h b/hurd/hurd/signal.h index 4b439b6..27349d3 100644 --- a/hurd/hurd/signal.h +++ b/hurd/hurd/signal.h @@ -43,6 +43,18 @@ Cambridge, MA 02139, USA. */ struct hurd_signal_preempter; /* */ +/* Full details of a signal. */ +struct hurd_signal_detail + { + /* Codes from origination Mach exception_raise message. */ + integer_t exc, exc_code, exc_subcode; + /* Sigcode as passed or computed from exception codes. */ + integer_t code; + /* Error code as passed or extracted from exception codes. */ + error_t error; + }; + + /* Per-thread signal state. */ struct hurd_sigstate @@ -65,13 +77,8 @@ struct hurd_sigstate stack frame, and each next element in an outermore frame. */ struct hurd_signal_preempter *preempters; - struct - { - /* For each signal that may be pending, the - sigcode and error code to deliver it with. */ - long int code; - error_t error; - } pending_data[NSIG]; + /* For each signal that may be pending, the details to deliver it with. */ + struct hurd_signal_detail pending_data[NSIG]; /* If `suspended' is set when this thread gets a signal, the signal thread sends an empty message to it. */ @@ -217,27 +224,27 @@ extern void _hurdsig_init (void); extern void _hurdsig_fault_init (void); -/* Raise a signal as described by SIGNO, SIGCODE and SIGERROR, on the - thread whose sigstate SS points to. If SS is a null pointer, this - instead affects the calling thread. */ +/* Raise a signal as described by SIGNO an DETAIL, on the thread whose + sigstate SS points to. If SS is a null pointer, this instead affects + the calling thread. */ -extern void _hurd_raise_signal (struct hurd_sigstate *ss, - int signo, long int sigcode, int sigerror); +extern void _hurd_raise_signal (struct hurd_sigstate *ss, int signo, + const struct hurd_signal_detail *detail); /* Translate a Mach exception into a signal (machine-dependent). */ -extern void _hurd_exception2signal (int exception, int code, int subcode, - int *signo, long int *sigcode, int *error); +extern void _hurd_exception2signal (struct hurd_signal_detail *); /* Make the thread described by SS take the signal described by SIGNO and - SIGCODE. If the process is traced, this will in fact stop with a SIGNO + DETAIL. If the process is traced, this will in fact stop with a SIGNO as the stop signal unless UNTRACED is nonzero. When the signal can be considered delivered, sends a sig_post reply message on REPLY_PORT indicating success. SS is not locked. */ extern void _hurd_internal_post_signal (struct hurd_sigstate *ss, - int signo, long int sigcode, int error, + int signo, + struct hurd_signal_detail *detail, mach_port_t reply_port, mach_msg_type_name_t reply_port_type, int untraced); @@ -252,7 +259,7 @@ extern void _hurd_internal_post_signal (struct hurd_sigstate *ss, struct machine_thread_all_state; extern struct sigcontext * _hurd_setup_sighandler (struct hurd_sigstate *ss, __sighandler_t handler, - int signo, long int sigcode, + int signo, const struct hurd_signal_detail *detail, int rpc_wait, struct machine_thread_all_state *state); /* Function run by the signal thread to receive from the signal port. */ diff --git a/hurd/hurd/sigpreempt.h b/hurd/hurd/sigpreempt.h index 4042ea2..1bd6589 100644 --- a/hurd/hurd/sigpreempt.h +++ b/hurd/hurd/sigpreempt.h @@ -23,6 +23,7 @@ Cambridge, MA 02139, USA. */ #include #include /* For sigset_t, sighandler_t, SIG_ERR. */ struct hurd_sigstate; /* */ +struct hurd_signal_detail; /* */ struct hurd_signal_preempter { @@ -39,7 +40,7 @@ struct hurd_signal_preempter is processed as if the return value were its handler setting. */ sighandler_t (*preempter) (struct hurd_signal_preempter *preempter, struct hurd_sigstate *ss, - int *signo, long int *sigcode, int *sigerror); + int *signo, struct hurd_signal_detail *detail); /* If PREEMPTER is null, act as if it returned HANDLER. */ sighandler_t handler; diff --git a/hurd/hurdsig.c b/hurd/hurdsig.c index b1a551d..2a517cf 100644 --- a/hurd/hurdsig.c +++ b/hurd/hurdsig.c @@ -428,7 +428,7 @@ sigset_t _hurdsig_preempted_set; /* Deliver a signal. SS is not locked. */ void _hurd_internal_post_signal (struct hurd_sigstate *ss, - int signo, long int sigcode, int sigerror, + int signo, struct hurd_signal_detail *detail, mach_port_t reply_port, mach_msg_type_name_t reply_port_type, int untraced) @@ -459,10 +459,9 @@ _hurd_internal_post_signal (struct hurd_sigstate *ss, void mark_pending (void) { __sigaddset (&ss->pending, signo); - /* Save the code to be given to the handler when SIGNO is + /* Save the details to be given to the handler when SIGNO is unblocked. */ - ss->pending_data[signo].code = sigcode; - ss->pending_data[signo].error = sigerror; + ss->pending_data[signo] = *detail; } /* Suspend the process with SIGNO. */ @@ -540,8 +539,8 @@ _hurd_internal_post_signal (struct hurd_sigstate *ss, handler = SIG_ERR; for (pe = ss->preempters; pe && handler == SIG_ERR; pe = pe->next) - if (HURD_PREEMPT_SIGNAL_P (pe, signo, sigcode)) - handler = (*pe->preempter) (pe, ss, &signo, &sigcode, &sigerror); + if (HURD_PREEMPT_SIGNAL_P (pe, signo, detail->code)) + handler = (*pe->preempter) (pe, ss, &signo, detail); if (handler == SIG_ERR && (__sigmask (signo) & _hurdsig_preempted_set)) { @@ -1061,14 +1060,18 @@ _S_msg_sig_post (mach_port_t me, mach_port_t refport) { error_t err; + struct hurd_signal_detail d; if (err = signal_allowed (signo, refport)) return err; + d.code = sigcode; + d.exc = 0; + /* Post the signal to the designated signal-receiving thread. This will reply when the signal can be considered delivered. */ _hurd_internal_post_signal (_hurd_thread_sigstate (_hurd_sigthread), - signo, sigcode, 0, reply_port, reply_port_type, + signo, &d, reply_port, reply_port_type, 0); /* Stop if traced. */ return MIG_NO_REPLY; /* Already replied. */ @@ -1085,14 +1088,18 @@ _S_msg_sig_post_untraced (mach_port_t me, mach_port_t refport) { error_t err; + struct hurd_signal_detail d; if (err = signal_allowed (signo, refport)) return err; + d.code = sigcode; + d.exc = 0; + /* Post the signal to the designated signal-receiving thread. This will reply when the signal can be considered delivered. */ _hurd_internal_post_signal (_hurd_thread_sigstate (_hurd_sigthread), - signo, sigcode, 0, reply_port, reply_port_type, + signo, &d, reply_port, reply_port_type, 1); /* Untraced flag. */ return MIG_NO_REPLY; /* Already replied. */ -- cgit v1.1