New file.
[kopensolaris-gnu/glibc.git] / hurd / hurd / sigpreempt.h
1 /* Preemption of Hurd signals before POSIX.1 semantics take over.
2 Copyright (C) 1996 Free Software Foundation, Inc.
3 This file is part of the GNU C Library.
4
5 The GNU C Library is free software; you can redistribute it and/or
6 modify it under the terms of the GNU Library General Public License as
7 published by the Free Software Foundation; either version 2 of the
8 License, or (at your option) any later version.
9
10 The GNU C Library is distributed in the hope that it will be useful,
11 but WITHOUT ANY WARRANTY; without even the implied warranty of
12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
13 Library General Public License for more details.
14
15 You should have received a copy of the GNU Library General Public
16 License along with the GNU C Library; see the file COPYING.LIB.  If
17 not, write to the Free Software Foundation, Inc., 675 Mass Ave,
18 Cambridge, MA 02139, USA.  */
19
20 #ifndef _HURD_SIGPREEMPT_H
21
22 #define _HURD_SIGPREEMPT_H      1
23 #include <errno.h>
24 #include <signal.h>             /* For sigset_t, sighandler_t, SIG_ERR.  */
25 struct hurd_sigstate;           /* <hurd/signal.h> */
26
27 struct hurd_signal_preempter
28   {
29     /* These members select which signals this structure will apply to.
30        The rest of the structure is only consulted if these match.  */
31     sigset_t signals;           /* Signals preempted.  */
32     unsigned long int first, last; /* Range of sigcode values preempted.  */
33
34     /* This function will be called (with SS->lock held) to decide what to
35        do with the signal described.  It may modify the codes of the signal
36        passed.  If the return value is SIG_ERR, the next matching preempter
37        is tried, or the normal handling is done for the signal (which may
38        have been changed by the preempter function).  Otherwise, the signal
39        is processed as if the return value were its handler setting.  */
40     sighandler_t (*preempter) (struct hurd_signal_preempter *preempter,
41                                struct hurd_sigstate *ss,
42                                int *signo, long int *sigcode, int *sigerror);
43     /* If PREEMPTER is null, act as if it returned HANDLER.  */
44     sighandler_t handler;
45
46     struct hurd_signal_preempter *next; /* List structure.  */
47   };
48
49 #define HURD_PREEMPT_SIGNAL_P(preempter, signo, sigcode) \
50   (((preempter)->signals & sigmask (signo)) && \
51    (sigcode) >= (preempter)->first && (sigcode) <= (preempter)->last)
52
53
54 /* Signal preempters applying to all threads; locked by _hurd_siglock.  */
55 extern struct hurd_signal_preempter *_hurdsig_preempters;
56 extern sigset_t _hurdsig_preempted_set;
57
58
59 /* The caller must initialize all members of *PREEMPTER except `next'.
60    The preempter is registered on the global list.  */
61 void hurd_preempt_signals (struct hurd_signal_preempter *preempter);
62
63 /* Remove a preempter registered with hurd_preempt_signals.  */
64 void hurd_unpreempt_signals (struct hurd_signal_preempter *preempter);
65
66
67 /* Call *OPERATE and return its value.  If a signal in SIGSET with a sigcode
68    in the range [FIRST,LAST] arrives during the call, catch it.  If HANDLER
69    is a function, it handles the signal in the normal way (i.e. it should
70    longjmp unless it can restart the insn on return).  If it is SIG_ERR,
71    hurd_catch_signal returns the sc_error value from the signal (or
72    EGRATUITOUS if that is zero).
73
74    The preempter structure is passed to *OPERATE, which may modify its
75    sigcode range or functions at any time during which it is guaranteed no
76    signal in SIGSET will arrive.  */
77
78 error_t hurd_catch_signal (sigset_t sigset,
79                            unsigned long int first, unsigned long int last,
80                            error_t (*operate) (struct hurd_signal_preempter *),
81                            sighandler_t handler);
82
83
84 /* Convenience functions using `hurd_catch_signal'.  */
85
86 error_t hurd_safe_memmove (void *dest, const void *src, size_t nbytes);
87 error_t hurd_safe_memset (void *dest, int byte, size_t nbytes);
88
89
90 #endif  /* hurd/sigpreempt.h */