summaryrefslogtreecommitdiff
path: root/sys/dev/sysmon
diff options
context:
space:
mode:
authorgmcgarry <gmcgarry@NetBSD.org>2008-09-05 22:06:52 +0000
committergmcgarry <gmcgarry@NetBSD.org>2008-09-05 22:06:52 +0000
commitc8ddbd2d15f12821ea31e459d4498a6b17eeb8db (patch)
tree3ddd21af9ea1a5d043f4674d74c276e799d283d4 /sys/dev/sysmon
parent2b28c4e8869495bbfe146070a57362892355d8f7 (diff)
Rearrange code in the sysmon queue execution thread to simplify locking logic.
Removes unreachable code warning.
Diffstat (limited to 'sys/dev/sysmon')
-rw-r--r--sys/dev/sysmon/sysmon_taskq.c36
1 files changed, 17 insertions, 19 deletions
diff --git a/sys/dev/sysmon/sysmon_taskq.c b/sys/dev/sysmon/sysmon_taskq.c
index cccb93b8e2f..4d145715936 100644
--- a/sys/dev/sysmon/sysmon_taskq.c
+++ b/sys/dev/sysmon/sysmon_taskq.c
@@ -1,4 +1,4 @@
-/* $NetBSD: sysmon_taskq.c,v 1.13 2008/04/06 09:42:04 xtraeme Exp $ */
+/* $NetBSD: sysmon_taskq.c,v 1.14 2008/09/05 22:06:52 gmcgarry Exp $ */
/*
* Copyright (c) 2001, 2003 Wasabi Systems, Inc.
@@ -41,7 +41,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: sysmon_taskq.c,v 1.13 2008/04/06 09:42:04 xtraeme Exp $");
+__KERNEL_RCSID(0, "$NetBSD: sysmon_taskq.c,v 1.14 2008/09/05 22:06:52 gmcgarry Exp $");
#include <sys/param.h>
#include <sys/malloc.h>
@@ -145,29 +145,27 @@ sysmon_task_queue_thread(void *arg)
* condition; it's probably more important to actually run
* all the tasks before we exit.
*/
+ mutex_enter(&sysmon_task_queue_mtx);
for (;;) {
- mutex_enter(&sysmon_task_queue_mtx);
st = TAILQ_FIRST(&sysmon_task_queue);
- if (st == NULL) {
+ if (st != NULL) {
+ TAILQ_REMOVE(&sysmon_task_queue, st, st_list);
+ mutex_exit(&sysmon_task_queue_mtx);
+ (*st->st_func)(st->st_arg);
+ free(st, M_TEMP);
+ mutex_enter(&sysmon_task_queue_mtx);
+ } else {
/* Check for the exit condition. */
- if (sysmon_task_queue_cleanup_sem != 0) {
- /* Time to die. */
- sysmon_task_queue_cleanup_sem = 0;
- cv_broadcast(&sysmon_task_queue_cv);
- mutex_exit(&sysmon_task_queue_mtx);
- kthread_exit(0);
- }
+ if (sysmon_task_queue_cleanup_sem != 0)
+ break;
cv_wait(&sysmon_task_queue_cv, &sysmon_task_queue_mtx);
- mutex_exit(&sysmon_task_queue_mtx);
- continue;
}
- TAILQ_REMOVE(&sysmon_task_queue, st, st_list);
- mutex_exit(&sysmon_task_queue_mtx);
-
- (*st->st_func)(st->st_arg);
- free(st, M_TEMP);
}
- panic("sysmon_task_queue_thread: impossible");
+ /* Time to die. */
+ sysmon_task_queue_cleanup_sem = 0;
+ cv_broadcast(&sysmon_task_queue_cv);
+ mutex_exit(&sysmon_task_queue_mtx);
+ kthread_exit(0);
}
/*