diff options
author | 1999-11-07 17:39:14 +0000 | |
---|---|---|
committer | 1999-11-07 17:39:14 +0000 | |
commit | 52890ed5eb51a06eaa600e1bc69dd2af52c223c6 (patch) | |
tree | c03a0dc0f571cf48e3f612aaad881800e399777a /sys/kern/kern_subr.c | |
parent | compress_log() now needs to check for noaction != 0 (diff) | |
download | wireguard-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.c | 68 |
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); + } +} |