diff options
| author | pgoyette <pgoyette@NetBSD.org> | 2010-03-27 13:23:18 +0000 |
|---|---|---|
| committer | pgoyette <pgoyette@NetBSD.org> | 2010-03-27 13:23:18 +0000 |
| commit | 5dbc4fad52acd6657190693cd8ca853e15db945d (patch) | |
| tree | 1785728c91c7b450e34095a11df87cd73fa321ec /sys/dev | |
| parent | 2b081a89935de17aa5d974d6d5f58241774187e0 (diff) | |
Fix the locking protocol in sysmon_envsys_foreach_sensor(), and add an
additional argument to control whether or not the sensors are refreshed
before invoking the callback routine.
Diffstat (limited to 'sys/dev')
| -rw-r--r-- | sys/dev/sysmon/sysmon_envsys.c | 17 | ||||
| -rw-r--r-- | sys/dev/sysmon/sysmonvar.h | 5 |
2 files changed, 15 insertions, 7 deletions
diff --git a/sys/dev/sysmon/sysmon_envsys.c b/sys/dev/sysmon/sysmon_envsys.c index f0c62ca397f..53198b7f866 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.101 2010/03/26 21:06:25 pgoyette Exp $ */ +/* $NetBSD: sysmon_envsys.c,v 1.102 2010/03/27 13:23:18 pgoyette Exp $ */ /*- * Copyright (c) 2007, 2008 Juan Romero Pardines. @@ -64,7 +64,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: sysmon_envsys.c,v 1.101 2010/03/26 21:06:25 pgoyette Exp $"); +__KERNEL_RCSID(0, "$NetBSD: sysmon_envsys.c,v 1.102 2010/03/27 13:23:18 pgoyette Exp $"); #include <sys/param.h> #include <sys/types.h> @@ -2011,7 +2011,8 @@ out: */ void sysmon_envsys_foreach_sensor(bool(*func)(struct sysmon_envsys *, - envsys_data_t *, void*), void *arg) + envsys_data_t *, void*), void *arg, + bool refresh) { struct sysmon_envsys *sme; envsys_data_t *sensor; @@ -2019,12 +2020,18 @@ sysmon_envsys_foreach_sensor(bool(*func)(struct sysmon_envsys *, mutex_enter(&sme_global_mtx); LIST_FOREACH(sme, &sysmon_envsys_list, sme_list) { - mutex_enter(&sme->sme_mtx); + sysmon_envsys_acquire(sme, false); TAILQ_FOREACH(sensor, &sme->sme_sensors_list, sensors_head) { + if (refresh && + (sme->sme_flags & SME_DISABLE_REFRESH) == 0) { + mutex_enter(&sme->sme_mtx); + (*sme->sme_refresh)(sme, sensor); + mutex_exit(&sme->sme_mtx); + } if (!(*func)(sme, sensor, arg)) break; } - mutex_exit(&sme->sme_mtx); + sysmon_envsys_release(sme, false); } mutex_exit(&sme_global_mtx); } diff --git a/sys/dev/sysmon/sysmonvar.h b/sys/dev/sysmon/sysmonvar.h index 0e66e609d72..298c9325eba 100644 --- a/sys/dev/sysmon/sysmonvar.h +++ b/sys/dev/sysmon/sysmonvar.h @@ -1,4 +1,4 @@ -/* $NetBSD: sysmonvar.h,v 1.35 2010/03/26 20:31:06 pgoyette Exp $ */ +/* $NetBSD: sysmonvar.h,v 1.36 2010/03/27 13:23:18 pgoyette Exp $ */ /*- * Copyright (c) 2000 Zembu Labs, Inc. @@ -209,7 +209,8 @@ void sysmon_envsys_sensor_event(struct sysmon_envsys *, envsys_data_t *, int); void sysmon_envsys_foreach_sensor(bool(*)(struct sysmon_envsys *, - envsys_data_t *, void*), void *); + envsys_data_t *, void*), void *, + bool); void sysmon_envsys_init(void); |
