summaryrefslogtreecommitdiff
path: root/sys/dev
diff options
context:
space:
mode:
authorpgoyette <pgoyette@NetBSD.org>2010-03-27 13:23:18 +0000
committerpgoyette <pgoyette@NetBSD.org>2010-03-27 13:23:18 +0000
commit5dbc4fad52acd6657190693cd8ca853e15db945d (patch)
tree1785728c91c7b450e34095a11df87cd73fa321ec /sys/dev
parent2b081a89935de17aa5d974d6d5f58241774187e0 (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.c17
-rw-r--r--sys/dev/sysmon/sysmonvar.h5
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);