diff options
| author | yamt <yamt@NetBSD.org> | 2003-08-11 15:07:14 +0000 |
|---|---|---|
| committer | yamt <yamt@NetBSD.org> | 2003-08-11 15:07:14 +0000 |
| commit | 44d0d57217dd86e8cc3359cbc8d743d89bbc3bc5 (patch) | |
| tree | 99d71f3f367a3a91209c9eb881708ac2abbbc020 /sys/dev | |
| parent | 104f2a80dfd77769f69107b2e31e5f00c83b716d (diff) | |
do wakeup() only when someone is waiting for us.
Diffstat (limited to 'sys/dev')
| -rw-r--r-- | sys/dev/sysmon/sysmon_envsys.c | 13 | ||||
| -rw-r--r-- | sys/dev/sysmon/sysmonvar.h | 5 |
2 files changed, 11 insertions, 7 deletions
diff --git a/sys/dev/sysmon/sysmon_envsys.c b/sys/dev/sysmon/sysmon_envsys.c index c535a4d2391..ba2150715bc 100644 --- a/sys/dev/sysmon/sysmon_envsys.c +++ b/sys/dev/sysmon/sysmon_envsys.c @@ -1,4 +1,4 @@ -/* $NetBSD: sysmon_envsys.c,v 1.7 2003/08/11 14:24:41 yamt Exp $ */ +/* $NetBSD: sysmon_envsys.c,v 1.8 2003/08/11 15:07:14 yamt Exp $ */ /*- * Copyright (c) 2000 Zembu Labs, Inc. @@ -41,7 +41,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: sysmon_envsys.c,v 1.7 2003/08/11 14:24:41 yamt Exp $"); +__KERNEL_RCSID(0, "$NetBSD: sysmon_envsys.c,v 1.8 2003/08/11 15:07:14 yamt Exp $"); #include <sys/param.h> #include <sys/conf.h> @@ -244,7 +244,7 @@ sysmon_envsys_register(struct sysmon_envsys *sme) { int error = 0; - KASSERT((sme->sme_flags & SME_FLAG_BUSY) == 0); + KASSERT((sme->sme_flags & (SME_FLAG_BUSY | SME_FLAG_WANTED)) == 0); simple_lock(&sysmon_envsys_list_slock); if (sme->sme_envsys_version != SYSMON_ENVSYS_VERSION) { @@ -272,6 +272,7 @@ sysmon_envsys_unregister(struct sysmon_envsys *sme) simple_lock(&sysmon_envsys_list_slock); while (sme->sme_flags & SME_FLAG_BUSY) { + sme->sme_flags |= SME_FLAG_WANTED; ltsleep(sme, PWAIT, "smeunreg", 0, &sysmon_envsys_list_slock); } LIST_REMOVE(sme, sme_list); @@ -296,6 +297,7 @@ again: if (idx >= sme->sme_fsensor && idx < (sme->sme_fsensor + sme->sme_nsensors)) { if (sme->sme_flags & SME_FLAG_BUSY) { + sme->sme_flags |= SME_FLAG_WANTED; ltsleep(sme, PWAIT, "smefind", 0, &sysmon_envsys_list_slock); goto again; @@ -322,7 +324,8 @@ sysmon_envsys_release(struct sysmon_envsys *sme) KASSERT(sme->sme_flags & SME_FLAG_BUSY); simple_lock(&sysmon_envsys_list_slock); - sme->sme_flags &= ~SME_FLAG_BUSY; - wakeup(sme); + if (sme->sme_flags & SME_FLAG_WANTED) + wakeup(sme); + sme->sme_flags &= ~(SME_FLAG_BUSY | SME_FLAG_WANTED); simple_unlock(&sysmon_envsys_list_slock); } diff --git a/sys/dev/sysmon/sysmonvar.h b/sys/dev/sysmon/sysmonvar.h index 721e9b55fcf..f24635b5d43 100644 --- a/sys/dev/sysmon/sysmonvar.h +++ b/sys/dev/sysmon/sysmonvar.h @@ -1,4 +1,4 @@ -/* $NetBSD: sysmonvar.h,v 1.9 2003/08/11 14:24:41 yamt Exp $ */ +/* $NetBSD: sysmonvar.h,v 1.10 2003/08/11 15:07:14 yamt Exp $ */ /*- * Copyright (c) 2000 Zembu Labs, Inc. @@ -69,10 +69,11 @@ struct sysmon_envsys { u_int sme_fsensor; /* sensor index base, from sysmon */ u_int sme_nsensors; /* sensor count, from driver */ - int sme_flags; + int sme_flags; /* SME_FLAG_ flags defined below */ }; #define SME_FLAG_BUSY 0x00000001 /* sme is busy */ +#define SME_FLAG_WANTED 0x00000002 /* someone waiting for this */ #define SME_SENSOR_IDX(sme, idx) ((idx) - (sme)->sme_fsensor) |
