summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJulian Elischer <julian@FreeBSD.org>1996-08-19 02:28:24 +0000
committerJulian Elischer <julian@FreeBSD.org>1996-08-19 02:28:24 +0000
commitfed06968ba048763bf98090a3b7aa8ad62898a2c (patch)
treef5a9611f18b87469232167daff0962d727ae98c0
parent3fcaebbf7988deccd31cfb369db0b685b430be69 (diff)
Notes
-rw-r--r--sys/kern/kern_exit.c72
-rw-r--r--sys/kern/kern_fork.c73
2 files changed, 143 insertions, 2 deletions
diff --git a/sys/kern/kern_exit.c b/sys/kern/kern_exit.c
index 0746e5876b230..d7e42026b83e0 100644
--- a/sys/kern/kern_exit.c
+++ b/sys/kern/kern_exit.c
@@ -36,7 +36,7 @@
* SUCH DAMAGE.
*
* @(#)kern_exit.c 8.7 (Berkeley) 2/12/94
- * $Id: kern_exit.c,v 1.34 1996/07/27 03:23:42 dyson Exp $
+ * $Id: kern_exit.c,v 1.35 1996/07/30 03:08:37 dyson Exp $
*/
#include "opt_ktrace.h"
@@ -81,6 +81,16 @@
static int wait1 __P((struct proc *, struct wait_args *, int [], int));
/*
+ * callout list for things to do at exit time
+ */
+typedef struct exit_list_element {
+ struct exit_list_element *next;
+ exitlist_fn function;
+} *ele_p;
+
+static ele_p exit_list;
+
+/*
* exit --
* Death of process.
*/
@@ -109,6 +119,7 @@ exit1(p, rv)
{
register struct proc *q, *nq;
register struct vmspace *vm;
+ ele_p ep = exit_list;
if (p->p_pid == 1) {
printf("init died (signal %d, exit %d)\n",
@@ -118,6 +129,16 @@ exit1(p, rv)
#ifdef PGINPROF
vmsizmon();
#endif
+ /*
+ * Check if any LKMs need anything done at process exit
+ * e.g. SYSV IPC stuff
+ * XXX what if one of these generates an error?
+ */
+ while(ep) {
+ (*ep->function)(p);
+ ep = ep->next;
+ }
+
if (p->p_flag & P_PROFIL)
stopprofclock(p);
MALLOC(p->p_ru, struct rusage *, sizeof(struct rusage),
@@ -473,3 +494,52 @@ proc_reparent(child, parent)
LIST_INSERT_HEAD(&parent->p_children, child, p_sibling);
child->p_pptr = parent;
}
+
+/*********************************************************
+ * general routines to handle adding/deleting items on the
+ * exit callout list
+ *****
+ * Take the arguments given and put them onto the exit callout list.
+ * However first make sure that it's not already there.
+ * returns 0 on success.
+ */
+int
+at_exit(exitlist_fn function)
+{
+ ele_p ep;
+ if(rm_at_exit(function)) {
+ printf("exit callout entry already present\n");
+ }
+ ep = malloc(sizeof(*ep),M_TEMP,M_NOWAIT);
+ if(!ep) return ENOMEM;
+ ep->next = exit_list;
+ ep->function = function;
+ exit_list = ep;
+ return 0;
+}
+/*
+ * Scan the exit callout list for the given items and remove them.
+ * Returns the number of items removed.
+ */
+int
+rm_at_exit(exitlist_fn function)
+{
+ ele_p *epp,ep;
+ int count = 0;
+
+ epp = &exit_list;
+ ep = *epp;
+ while(ep) {
+ if(ep->function == function) {
+ *epp = ep->next;
+ free(ep,M_TEMP);
+ count++;
+ } else {
+ epp = &ep->next;
+ }
+ ep = *epp;
+ }
+ return count;
+}
+
+
diff --git a/sys/kern/kern_fork.c b/sys/kern/kern_fork.c
index 2ac184961db27..f6bb2840748b8 100644
--- a/sys/kern/kern_fork.c
+++ b/sys/kern/kern_fork.c
@@ -36,7 +36,7 @@
* SUCH DAMAGE.
*
* @(#)kern_fork.c 8.6 (Berkeley) 4/8/94
- * $Id: kern_fork.c,v 1.22 1996/06/12 05:07:30 gpalmer Exp $
+ * $Id: kern_fork.c,v 1.23 1996/07/31 09:26:34 davidg Exp $
*/
#include "opt_ktrace.h"
@@ -64,6 +64,16 @@
static int fork1 __P((struct proc *p, int flags, int *retval));
+/*
+ * callout list for things to do at fork time
+ */
+typedef struct fork_list_element {
+ struct fork_list_element *next;
+ forklist_fn function;
+} *fle_p;
+
+static fle_p fork_list;
+
#ifndef _SYS_SYSPROTO_H_
struct fork_args {
int dummy;
@@ -114,6 +124,7 @@ fork1(p1, flags, retval)
struct proc *newproc;
int count;
static int nextpid, pidchecked = 0;
+ fle_p ep = fork_list;
if ((flags & RFPROC) == 0)
return (EINVAL);
@@ -335,6 +346,16 @@ again:
}
/*
+ * Both processes are set up,
+ * check if any LKMs want to adjust anything
+ * What if they have an error? XXX
+ */
+ while(ep) {
+ (*ep->function)(p1,p2,flags);
+ ep = ep->next;
+ }
+
+ /*
* Make child runnable and add to run queue.
*/
(void) splhigh();
@@ -363,3 +384,53 @@ again:
retval[1] = 0;
return (0);
}
+
+
+/*********************************************************
+ * general routines to handle adding/deleting items on the
+ * fork callout list
+ *****
+ * Take the arguments given and put them onto the fork callout list.
+ * However first make sure that it's not already there.
+ * returns 0 on success.
+ */
+int
+at_fork(forklist_fn function)
+{
+ fle_p ep;
+ if(rm_at_fork(function)) {
+ printf("fork callout entry already present\n");
+ }
+ ep = malloc(sizeof(*ep),M_TEMP,M_NOWAIT);
+ if(!ep) return ENOMEM;
+ ep->next = fork_list;
+ ep->function = function;
+ fork_list = ep;
+ return 0;
+}
+/*
+ * Scan the exit callout list for the given items and remove them.
+ * Returns the number of items removed.
+ */
+int
+rm_at_fork(forklist_fn function)
+{
+ fle_p *epp,ep;
+ int count = 0;
+
+ epp = &fork_list;
+ ep = *epp;
+ while(ep) {
+ if(ep->function == function) {
+ *epp = ep->next;
+ free(ep,M_TEMP);
+ count++;
+ } else {
+ epp = &ep->next;
+ }
+ ep = *epp;
+ }
+ return count;
+}
+
+