diff options
author | Andrew Thompson <thompsa@FreeBSD.org> | 2009-12-17 21:17:13 +0000 |
---|---|---|
committer | Andrew Thompson <thompsa@FreeBSD.org> | 2009-12-17 21:17:13 +0000 |
commit | 2b54315009b494874722211de9c40daff2e7e38c (patch) | |
tree | c370b5f0cdc8d1c1c9dda6d153ac8eaf0cd1e050 | |
parent | d14ec166338e81c3f9e6f7a42698ad3622476467 (diff) |
Notes
-rw-r--r-- | sys/kern/subr_eventhandler.c | 11 |
1 files changed, 7 insertions, 4 deletions
diff --git a/sys/kern/subr_eventhandler.c b/sys/kern/subr_eventhandler.c index f9c8eadaf4e0..37c482cbd7ff 100644 --- a/sys/kern/subr_eventhandler.c +++ b/sys/kern/subr_eventhandler.c @@ -178,6 +178,8 @@ eventhandler_deregister(struct eventhandler_list *list, eventhandler_tag tag) ep->ee_priority = EHE_DEAD_PRIORITY; } } + while (list->el_runcount > 0) + mtx_sleep(list, &list->el_lock, 0, "evhrm", 0); EHL_UNLOCK(list); } @@ -225,16 +227,17 @@ void eventhandler_prune_list(struct eventhandler_list *list) { struct eventhandler_entry *ep, *en; + int pruned = 0; CTR2(KTR_EVH, "%s: pruning list \"%s\"", __func__, list->el_name); EHL_LOCK_ASSERT(list, MA_OWNED); - ep = TAILQ_FIRST(&list->el_entries); - while (ep != NULL) { - en = TAILQ_NEXT(ep, ee_link); + TAILQ_FOREACH_SAFE(ep, &list->el_entries, ee_link, en) { if (ep->ee_priority == EHE_DEAD_PRIORITY) { TAILQ_REMOVE(&list->el_entries, ep, ee_link); free(ep, M_EVENTHANDLER); + pruned++; } - ep = en; } + if (pruned > 0) + wakeup(list); } |