Index: sys/kern/kern_subr.c
===================================================================
RCS file: /cvsroot/src/sys/kern/kern_subr.c,v
retrieving revision 1.135
diff -u -r1.135 kern_subr.c
--- sys/kern/kern_subr.c 28 Mar 2006 17:38:39 -0000 1.135
+++ sys/kern/kern_subr.c 22 Apr 2006 17:02:55 -0000
@@ -509,18 +509,48 @@
* it won't be run again.
*/
-static hook_list_t shutdownhook_list;
+struct shutdownhook_desc {
+ LIST_ENTRY(shutdownhook_desc) shk_list;
+ void (*shk_fn)(int, void *);
+ void *shk_arg;
+};
+
+static LIST_HEAD(, shutdownhook_desc) shutdownhook_list =
+ LIST_HEAD_INITIALIZER(shutdownhook_list);
void *
-shutdownhook_establish(void (*fn)(void *), void *arg)
+shutdownhook_establish(void (*fn)(int, void *), void *arg)
{
- return hook_establish(&shutdownhook_list, fn, arg);
+ struct shutdownhook_desc *hd;
+
+ hd = malloc(sizeof(*hd), M_DEVBUF, M_NOWAIT);
+ if (hd == NULL)
+ return (NULL);
+
+ hd->shk_fn = fn;
+ hd->shk_arg = arg;
+ LIST_INSERT_HEAD(&shutdownhook_list, hd, shk_list);
+
+ return (hd);
}
void
shutdownhook_disestablish(void *vhook)
{
- hook_disestablish(&shutdownhook_list, vhook);
+#ifdef DIAGNOSTIC
+ struct shutdownhook_desc *hd;
+
+ LIST_FOREACH(hd, &shutdownhook_list, shk_list) {
+ if (hd == vhook)
+ break;
+ }
+
+ if (hd == NULL)
+ panic("hook_disestablish: hook %p not established", vhook);
+#endif
+ LIST_REMOVE((struct shutdownhook_desc *)vhook, shk_list);
+ free(vhook, M_DEVBUF);
+
}
/*
@@ -532,13 +562,15 @@
* it won't be run again.
*/
void
-doshutdownhooks(void)
+doshutdownhooks(int howto)
{
- struct hook_desc *dp;
+ struct shutdownhook_desc *dp;
- while ((dp = LIST_FIRST(&shutdownhook_list)) != NULL) {
- LIST_REMOVE(dp, hk_list);
- (*dp->hk_fn)(dp->hk_arg);
+ LIST_FOREACH(dp, &shutdownhook_list, shk_list) {
+ // XXX: Please get comments on this.
+ // while ((dp = LIST_FIRST(&shutdownhook_list)) != NULL) {
+ // LIST_REMOVE(dp, hk_list);
+ (*dp->shk_fn)(howto, dp->shk_arg);
#if 0
/*
* Don't bother freeing the hook structure,, since we may
Index: sys/sys/systm.h
===================================================================
RCS file: /cvsroot/src/sys/sys/systm.h,v
retrieving revision 1.186
diff -u -r1.186 systm.h
--- sys/sys/systm.h 7 Mar 2006 13:18:20 -0000 1.186
+++ sys/sys/systm.h 22 Apr 2006 17:12:33 -0000
@@ -303,9 +303,9 @@
* Shutdown hooks. Functions to be run with all interrupts disabled
* immediately before the system is halted or rebooted.
*/
-void *shutdownhook_establish(void (*)(void *), void *);
+void *shutdownhook_establish(void (*)(int, void *), void *);
void shutdownhook_disestablish(void *);
-void doshutdownhooks(void);
+void doshutdownhooks(int);
/*
* Power management hooks.