From c87f1c4961bb04662b7e6266a96d44a61c9386f9 Mon Sep 17 00:00:00 2001 From: jhb Date: Tue, 14 Nov 2000 18:22:59 +0000 Subject: Only hold the mutex for an eventhandler list while the list is being accessed. Specifically, don't hold the lock while calling event handlers as a handler may tsleep() while holding the mutex. Found by: witness --- sys/sys/eventhandler.h | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/sys/sys/eventhandler.h b/sys/sys/eventhandler.h index c41acb5..4a1e01a 100644 --- a/sys/sys/eventhandler.h +++ b/sys/sys/eventhandler.h @@ -81,14 +81,14 @@ do { \ struct eventhandler_entry *_en; \ \ if (_el->el_flags & EHE_INITTED) { \ - mtx_enter(&_el->el_mutex, MTX_DEF); \ while (_ep != NULL) { \ + mtx_enter(&_el->el_mutex, MTX_DEF); \ _en = TAILQ_NEXT(_ep, ee_link); \ + mtx_exit(&_el->el_mutex, MTX_DEF); \ ((struct eventhandler_entry_ ## name *)_ep)->eh_func(_ep->ee_arg , \ ## args); \ _ep = _en; \ } \ - mtx_exit(&_el->el_mutex, MTX_DEF); \ } \ } while (0) @@ -122,13 +122,15 @@ do { \ (_el->el_flags & EHE_INITTED)) { \ mtx_enter(&_el->el_mutex, MTX_DEF); \ _ep = TAILQ_FIRST(&(_el->el_entries)); \ + mtx_exit(&_el->el_mutex, MTX_DEF); \ while (_ep != NULL) { \ + mtx_enter(&_el->el_mutex, MTX_DEF); \ _en = TAILQ_NEXT(_ep, ee_link); \ + mtx_exit(&_el->el_mutex, MTX_DEF); \ ((struct eventhandler_entry_ ## name *)_ep)->eh_func(_ep->ee_arg , \ ## args); \ _ep = _en; \ } \ - mtx_exit(&_el->el_mutex, MTX_DEF); \ } \ } while (0) -- cgit v1.1