Skip site navigation (1)Skip section navigation (2)
Date:      Thu, 17 Dec 2009 21:17:13 +0000 (UTC)
From:      Andrew Thompson <thompsa@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org
Subject:   svn commit: r200652 - head/sys/kern
Message-ID:  <200912172117.nBHLHDiY050859@svn.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: thompsa
Date: Thu Dec 17 21:17:13 2009
New Revision: 200652
URL: http://svn.freebsd.org/changeset/base/200652

Log:
  If the runcount is non-zero in eventhandler_deregister() then one or more
  threads are executing the eventhandler, sleep in this case to make it safe for
  module unload. If the runcount was up then an entry would have been marked
  EHE_DEAD_PRIORITY so use this as a trigger to do the wakeup in
  eventhandler_prune_list().
  
  Reviewed by:	jhb

Modified:
  head/sys/kern/subr_eventhandler.c

Modified: head/sys/kern/subr_eventhandler.c
==============================================================================
--- head/sys/kern/subr_eventhandler.c	Thu Dec 17 21:17:12 2009	(r200651)
+++ head/sys/kern/subr_eventhandler.c	Thu Dec 17 21:17:13 2009	(r200652)
@@ -178,6 +178,8 @@ eventhandler_deregister(struct eventhand
 		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);
 }



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200912172117.nBHLHDiY050859>