aboutsummaryrefslogtreecommitdiff
path: root/hurd
diff options
context:
space:
mode:
authorRoland McGrath <roland@gnu.org>1996-05-07 14:57:38 +0000
committerRoland McGrath <roland@gnu.org>1996-05-07 14:57:38 +0000
commit93a470c71a236c6fbf4f2a207eb3961754187e80 (patch)
treec6801bf6e8f7652cd06f81e8ff278243b5592a0d /hurd
parent4ddc1f9dd6c09e8924204f9ecf70c95157e555ec (diff)
downloadglibc-93a470c71a236c6fbf4f2a207eb3961754187e80.tar
glibc-93a470c71a236c6fbf4f2a207eb3961754187e80.tar.gz
glibc-93a470c71a236c6fbf4f2a207eb3961754187e80.tar.bz2
glibc-93a470c71a236c6fbf4f2a207eb3961754187e80.zip
Tue May 7 10:51:52 1996 Roland McGrath <roland@delasyd.gnu.ai.mit.edu>
* 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 <sys/types.h>. * 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.
Diffstat (limited to 'hurd')
-rw-r--r--hurd/hurd/fd.h10
-rw-r--r--hurd/hurd/signal.h41
-rw-r--r--hurd/hurd/sigpreempt.h3
-rw-r--r--hurd/hurdsig.c23
4 files changed, 48 insertions, 29 deletions
diff --git a/hurd/hurd/fd.h b/hurd/hurd/fd.h
index 4747c785a5..b6402ea075 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 4b439b6faa..27349d3ed0 100644
--- a/hurd/hurd/signal.h
+++ b/hurd/hurd/signal.h
@@ -43,6 +43,18 @@ Cambridge, MA 02139, USA. */
struct hurd_signal_preempter; /* <hurd/sigpreempt.h> */
+/* 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 4042ea2448..1bd6589e32 100644
--- a/hurd/hurd/sigpreempt.h
+++ b/hurd/hurd/sigpreempt.h
@@ -23,6 +23,7 @@ Cambridge, MA 02139, USA. */
#include <errno.h>
#include <signal.h> /* For sigset_t, sighandler_t, SIG_ERR. */
struct hurd_sigstate; /* <hurd/signal.h> */
+struct hurd_signal_detail; /* <hurd/signal.h> */
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 b1a551d7f3..2a517cfa5a 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. */