summaryrefslogtreecommitdiffstats
path: root/sys/kern/kern_subr.c
diff options
context:
space:
mode:
authorprovos <provos@openbsd.org>1999-11-07 17:39:14 +0000
committerprovos <provos@openbsd.org>1999-11-07 17:39:14 +0000
commit52890ed5eb51a06eaa600e1bc69dd2af52c223c6 (patch)
treec03a0dc0f571cf48e3f612aaad881800e399777a /sys/kern/kern_subr.c
parentcompress_log() now needs to check for noaction != 0 (diff)
downloadwireguard-openbsd-52890ed5eb51a06eaa600e1bc69dd2af52c223c6.tar.xz
wireguard-openbsd-52890ed5eb51a06eaa600e1bc69dd2af52c223c6.zip
add APM powerhooks.
from NetBSD, Sat Jun 26 08:25:25 1999 UTC by augustss: Add powerhooks, i.e., the ability to register a function that will be called when the machine does a suspend or resume. XXX Will go away when Jason's kevents come to life.
Diffstat (limited to 'sys/kern/kern_subr.c')
-rw-r--r--sys/kern/kern_subr.c68
1 files changed, 67 insertions, 1 deletions
diff --git a/sys/kern/kern_subr.c b/sys/kern/kern_subr.c
index be226f857e8..4a6321e1896 100644
--- a/sys/kern/kern_subr.c
+++ b/sys/kern/kern_subr.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: kern_subr.c,v 1.9 1999/04/28 09:28:15 art Exp $ */
+/* $OpenBSD: kern_subr.c,v 1.10 1999/11/07 17:39:14 provos Exp $ */
/* $NetBSD: kern_subr.c,v 1.15 1996/04/09 17:21:56 ragge Exp $ */
/*
@@ -249,3 +249,69 @@ doshutdownhooks()
dp->sfd_list.le_next)
(*dp->sfd_fn)(dp->sfd_arg);
}
+
+/*
+ * "Power hook" types, functions, and variables.
+ */
+
+struct powerhook_desc {
+ LIST_ENTRY(powerhook_desc) sfd_list;
+ void (*sfd_fn) __P((int, void *));
+ void *sfd_arg;
+};
+
+LIST_HEAD(, powerhook_desc) powerhook_list;
+
+void *
+powerhook_establish(fn, arg)
+ void (*fn) __P((int, void *));
+ void *arg;
+{
+ struct powerhook_desc *ndp;
+
+ ndp = (struct powerhook_desc *)
+ malloc(sizeof(*ndp), M_DEVBUF, M_NOWAIT);
+ if (ndp == NULL)
+ return NULL;
+
+ ndp->sfd_fn = fn;
+ ndp->sfd_arg = arg;
+ LIST_INSERT_HEAD(&powerhook_list, ndp, sfd_list);
+
+ return (ndp);
+}
+
+void
+powerhook_disestablish(vhook)
+ void *vhook;
+{
+#ifdef DIAGNOSTIC
+ struct powerhook_desc *dp;
+
+ for (dp = powerhook_list.lh_first; dp != NULL;
+ dp = dp->sfd_list.le_next)
+ if (dp == vhook)
+ break;
+ if (dp == NULL)
+ panic("powerhook_disestablish: hook not established");
+#endif
+
+ LIST_REMOVE((struct powerhook_desc *)vhook, sfd_list);
+ free(vhook, M_DEVBUF);
+}
+
+/*
+ * Run power hooks.
+ */
+void
+dopowerhooks(why)
+ int why;
+{
+ struct powerhook_desc *dp;
+
+ for (dp = LIST_FIRST(&powerhook_list);
+ dp != NULL;
+ dp = LIST_NEXT(dp, sfd_list)) {
+ (*dp->sfd_fn)(why, dp->sfd_arg);
+ }
+}