Module Name: src Committed By: riz Date: Wed Oct 17 21:06:56 UTC 2012
Modified Files: src/sys/dev/sysmon [netbsd-6]: sysmon_envsys.c sysmon_envsys_events.c sysmon_envsysvar.h Log Message: Pull up following revision(s) (requested by pgoyette in ticket #544): sys/dev/sysmon/sysmon_envsysvar.h: revision 1.42 sys/dev/sysmon/sysmon_envsys_events.c: revision 1.99 sys/dev/sysmon/sysmon_envsys.c: revision 1.119 When unregistering a sensor device, make sure we unregister and delete all the associated events. To generate a diff of this commit: cvs rdiff -u -r1.117 -r1.117.8.1 src/sys/dev/sysmon/sysmon_envsys.c cvs rdiff -u -r1.98 -r1.98.8.1 src/sys/dev/sysmon/sysmon_envsys_events.c cvs rdiff -u -r1.40 -r1.40.8.1 src/sys/dev/sysmon/sysmon_envsysvar.h Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.
Modified files: Index: src/sys/dev/sysmon/sysmon_envsys.c diff -u src/sys/dev/sysmon/sysmon_envsys.c:1.117 src/sys/dev/sysmon/sysmon_envsys.c:1.117.8.1 --- src/sys/dev/sysmon/sysmon_envsys.c:1.117 Mon Aug 1 12:28:53 2011 +++ src/sys/dev/sysmon/sysmon_envsys.c Wed Oct 17 21:06:56 2012 @@ -1,4 +1,4 @@ -/* $NetBSD: sysmon_envsys.c,v 1.117 2011/08/01 12:28:53 mbalmer Exp $ */ +/* $NetBSD: sysmon_envsys.c,v 1.117.8.1 2012/10/17 21:06:56 riz 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.117 2011/08/01 12:28:53 mbalmer Exp $"); +__KERNEL_RCSID(0, "$NetBSD: sysmon_envsys.c,v 1.117.8.1 2012/10/17 21:06:56 riz Exp $"); #include <sys/param.h> #include <sys/types.h> @@ -602,6 +602,7 @@ sysmon_envsys_sensor_detach(struct sysmo /* * remove it and decrement the sensors count. */ + sme_event_unregister_sensor(sme, edata); TAILQ_REMOVE(&sme->sme_sensors_list, edata, sensors_head); sme->sme_nsensors--; sysmon_envsys_release(sme, true); Index: src/sys/dev/sysmon/sysmon_envsys_events.c diff -u src/sys/dev/sysmon/sysmon_envsys_events.c:1.98 src/sys/dev/sysmon/sysmon_envsys_events.c:1.98.8.1 --- src/sys/dev/sysmon/sysmon_envsys_events.c:1.98 Wed Jun 8 16:14:57 2011 +++ src/sys/dev/sysmon/sysmon_envsys_events.c Wed Oct 17 21:06:55 2012 @@ -1,4 +1,4 @@ -/* $NetBSD: sysmon_envsys_events.c,v 1.98 2011/06/08 16:14:57 pgoyette Exp $ */ +/* $NetBSD: sysmon_envsys_events.c,v 1.98.8.1 2012/10/17 21:06:55 riz Exp $ */ /*- * Copyright (c) 2007, 2008 Juan Romero Pardines. @@ -30,7 +30,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: sysmon_envsys_events.c,v 1.98 2011/06/08 16:14:57 pgoyette Exp $"); +__KERNEL_RCSID(0, "$NetBSD: sysmon_envsys_events.c,v 1.98.8.1 2012/10/17 21:06:55 riz Exp $"); #include <sys/param.h> #include <sys/types.h> @@ -77,6 +77,8 @@ static bool sme_battery_check(void); static bool sme_battery_critical(envsys_data_t *); static bool sme_acadapter_check(void); +static void sme_remove_event(sme_event_t *, struct sysmon_envsys *); + /* * sme_event_register: * @@ -334,11 +336,11 @@ sme_event_unregister_all(struct sysmon_e break; if (strcmp(see->see_pes.pes_dvname, sme->sme_name) == 0) { - LIST_REMOVE(see, see_list); DPRINTF(("%s: event %s %d removed (%s)\n", __func__, see->see_pes.pes_sensname, see->see_type, sme->sme_name)); - kmem_free(see, sizeof(*see)); + sme_remove_event(see, sme); + evcounter--; } } @@ -386,6 +388,56 @@ sme_event_unregister(struct sysmon_envsy DPRINTF(("%s: removed dev=%s sensor=%s type=%d\n", __func__, see->see_pes.pes_dvname, sensor, type)); + + sme_remove_event(see, sme); + + mutex_exit(&sme->sme_mtx); + return 0; +} + +/* + * sme_event_unregister_sensor: + * + * + Unregisters any event associated with a specific sensor + * The caller must already own the sme_mtx. + */ +int +sme_event_unregister_sensor(struct sysmon_envsys *sme, envsys_data_t *edata) +{ + sme_event_t *see; + bool found = false; + + KASSERT(mutex_owned(&sme->sme_mtx)); + LIST_FOREACH(see, &sme->sme_events_list, see_list) { + if (see->see_edata == edata) { + found = true; + break; + } + } + if (!found) + return EINVAL; + + /* + * Wait for the event to finish its work, remove from the list + * and release resouces. + */ + while (see->see_flags & SEE_EVENT_WORKING) + cv_wait(&sme->sme_condvar, &sme->sme_mtx); + + DPRINTF(("%s: removed dev=%s sensor=%s\n", + __func__, see->see_pes.pes_dvname, edata->desc)); + + sme_remove_event(see, sme); + + return 0; +} + +static void +sme_remove_event(sme_event_t *see, struct sysmon_envsys *sme) +{ + + KASSERT(mutex_owned(&sme->sme_mtx)); + LIST_REMOVE(see, see_list); /* * So the events list is empty, we'll do the following: @@ -395,10 +447,8 @@ sme_event_unregister(struct sysmon_envsy */ if (LIST_EMPTY(&sme->sme_events_list)) sme_events_destroy(sme); - mutex_exit(&sme->sme_mtx); kmem_free(see, sizeof(*see)); - return 0; } /* Index: src/sys/dev/sysmon/sysmon_envsysvar.h diff -u src/sys/dev/sysmon/sysmon_envsysvar.h:1.40 src/sys/dev/sysmon/sysmon_envsysvar.h:1.40.8.1 --- src/sys/dev/sysmon/sysmon_envsysvar.h:1.40 Sun Jun 19 03:09:43 2011 +++ src/sys/dev/sysmon/sysmon_envsysvar.h Wed Oct 17 21:06:55 2012 @@ -1,4 +1,4 @@ -/* $NetBSD: sysmon_envsysvar.h,v 1.40 2011/06/19 03:09:43 pgoyette Exp $ */ +/* $NetBSD: sysmon_envsysvar.h,v 1.40.8.1 2012/10/17 21:06:55 riz Exp $ */ /*- * Copyright (c) 2007, 2008 Juan Romero Pardines. @@ -126,6 +126,7 @@ int sme_event_register(prop_dictionary_t struct sysmon_envsys *, sysmon_envsys_lim_t *, uint32_t, int, int); int sme_event_unregister(struct sysmon_envsys *, const char *, int); +int sme_event_unregister_sensor(struct sysmon_envsys *, envsys_data_t *); void sme_event_unregister_all(struct sysmon_envsys *); void sme_event_drvadd(void *); int sme_events_init(struct sysmon_envsys *);