From: Matthew Dillon Date: Mon, 13 Oct 2003 18:12:07 +0000 (+0000) Subject: Extend NSIG to 64 and introduce a registration function for the checkpointing X-Git-Tag: v2.0.1~12841 X-Git-Url: https://gitweb.dragonflybsd.org/dragonfly.git/commitdiff_plain/9d63d5c0dc1796ae72472c53142e42cfeee90091 Extend NSIG to 64 and introduce a registration function for the checkpointing signal to support the checkpoint module. This is somewhat of a hack at the moment but will be cleaned up later. Submitted-by: Kip Macy --- diff --git a/sys/kern/kern_sig.c b/sys/kern/kern_sig.c index 589dd90859..1fdc3b9dee 100644 --- a/sys/kern/kern_sig.c +++ b/sys/kern/kern_sig.c @@ -37,7 +37,7 @@ * * @(#)kern_sig.c 8.7 (Berkeley) 4/18/94 * $FreeBSD: src/sys/kern/kern_sig.c,v 1.72.2.17 2003/05/16 16:34:34 obrien Exp $ - * $DragonFly: src/sys/kern/kern_sig.c,v 1.20 2003/09/29 18:52:06 dillon Exp $ + * $DragonFly: src/sys/kern/kern_sig.c,v 1.21 2003/10/13 18:12:05 dillon Exp $ */ #include "opt_compat.h" @@ -136,6 +136,8 @@ SYSCTL_INT(_kern, OID_AUTO, coredump, CTLFLAG_RW, #define SA_IGNORE 0x10 /* ignore by default */ #define SA_CONT 0x20 /* continue if suspended */ #define SA_CANTMASK 0x40 /* non-maskable, catchable */ +#define SA_CKPT 0x80 /* checkpoint process */ + static int sigproptbl[NSIG] = { SA_KILL, /* SIGHUP */ @@ -169,6 +171,40 @@ static int sigproptbl[NSIG] = { SA_IGNORE, /* SIGINFO */ SA_KILL, /* SIGUSR1 */ SA_KILL, /* SIGUSR2 */ + SA_IGNORE, /* SIGTHR */ + SA_CKPT, /* SIGCKPT */ + SA_KILL|SA_CKPT, /* SIGCKPTEXIT */ + SA_IGNORE, + SA_IGNORE, + SA_IGNORE, + SA_IGNORE, + SA_IGNORE, + SA_IGNORE, + SA_IGNORE, + SA_IGNORE, + SA_IGNORE, + SA_IGNORE, + SA_IGNORE, + SA_IGNORE, + SA_IGNORE, + SA_IGNORE, + SA_IGNORE, + SA_IGNORE, + SA_IGNORE, + SA_IGNORE, + SA_IGNORE, + SA_IGNORE, + SA_IGNORE, + SA_IGNORE, + SA_IGNORE, + SA_IGNORE, + SA_IGNORE, + SA_IGNORE, + SA_IGNORE, + SA_IGNORE, + SA_IGNORE, + SA_IGNORE, + }; static __inline int @@ -883,6 +919,23 @@ trapsignal(p, sig, code) * Other ignored signals are discarded immediately. */ +/* + * temporary hack to allow checkpoint code to continue to + * be in a module for the moment + */ + +static proc_func_t ckpt_func; + +proc_func_t +register_ckpt_func(proc_func_t func) +{ + proc_func_t old_func; + + old_func = ckpt_func; + ckpt_func = func; + return (old_func); +} + void psignal(p, sig) struct proc *p; @@ -933,6 +986,7 @@ psignal(p, sig) if (prop & SA_CONT) SIG_STOPSIGMASK(p->p_siglist); + if (prop & SA_STOP) { /* @@ -948,6 +1002,14 @@ psignal(p, sig) } SIGADDSET(p->p_siglist, sig); + if (prop & SA_CKPT && action == SIG_DFL) { + SIGDELSET(p->p_siglist, sig); + if (ckpt_func) + ckpt_func(p); + if (prop & SA_KILL) + SIGADDSET(p->p_siglist, SIGKILL); + } + /* * Defer further processing for signals which are held, * except that stopped processes must be continued by SIGCONT. diff --git a/sys/sys/signal.h b/sys/sys/signal.h index 34a3d833c8..1139553e10 100644 --- a/sys/sys/signal.h +++ b/sys/sys/signal.h @@ -37,7 +37,7 @@ * * @(#)signal.h 8.4 (Berkeley) 5/4/95 * $FreeBSD: src/sys/sys/signal.h,v 1.23.2.2 2001/04/19 01:38:35 alfred Exp $ - * $DragonFly: src/sys/sys/signal.h,v 1.3 2003/08/20 07:31:21 rob Exp $ + * $DragonFly: src/sys/sys/signal.h,v 1.4 2003/10/13 18:12:07 dillon Exp $ */ #ifndef _SYS_SIGNAL_H_ @@ -103,6 +103,11 @@ #endif #define SIGUSR1 30 /* user defined signal 1 */ #define SIGUSR2 31 /* user defined signal 2 */ +#if __BSD_VISIBLE +#define SIGTHR 32 /* Thread interrupt (FreeBSD-5 reserved) */ +#define SIGCKPT 33 /* checkpoint and continue */ +#define SIGCKPTEXIT 34 /* checkpoint and exit */ +#endif /*- * Type of a signal handling function. @@ -214,7 +219,7 @@ struct sigaction { #define SA_USERTRAMP 0x0100 /* do not bounce off kernel's sigtramp */ #endif -#define NSIG 32 /* number of old signals (counting 0) */ +#define NSIG 64 /* size of sigptbl */ /* POSIX 1003.1b required values. */ #define SI_USER 0x10001 diff --git a/sys/sys/signalvar.h b/sys/sys/signalvar.h index 4544f9bea1..401ee166a9 100644 --- a/sys/sys/signalvar.h +++ b/sys/sys/signalvar.h @@ -32,7 +32,7 @@ * * @(#)signalvar.h 8.6 (Berkeley) 2/19/95 * $FreeBSD: src/sys/sys/signalvar.h,v 1.34.2.1 2000/05/16 06:58:05 dillon Exp $ - * $DragonFly: src/sys/sys/signalvar.h,v 1.5 2003/08/20 07:31:21 rob Exp $ + * $DragonFly: src/sys/sys/signalvar.h,v 1.6 2003/10/13 18:12:07 dillon Exp $ */ #ifndef _SYS_SIGNALVAR_H_ /* tmp for user.h */ @@ -190,6 +190,8 @@ __sigseteq(sigset_t *set1, sigset_t *set2) #ifdef _KERNEL +typedef void (*proc_func_t)(struct proc *); + struct pgrp; struct proc; struct sigio; @@ -211,6 +213,8 @@ void psignal (struct proc *p, int sig); void siginit (struct proc *p); void trapsignal (struct proc *p, int sig, u_long code); int __cursig (struct proc *p); +proc_func_t register_ckpt_func(proc_func_t func); + /* * Machine-dependent functions: