[libvirt] [PATCH libvirt-glib] Don't hold events lock when dispatching free callbacks

Daniel P. Berrange berrange at redhat.com
Mon Aug 20 15:14:52 UTC 2012


From: "Daniel P. Berrange" <berrange at redhat.com>

The _event_timeout_remove and _event_handle_remove methods
were holding onto the global lock when invoking the free
callback. This is a violation of the libvirt events API
contract which requires free callbacks to be invoked in
a re-entrant safe context.
---
 libvirt-glib/libvirt-glib-event.c | 8 ++------
 1 file changed, 2 insertions(+), 6 deletions(-)

diff --git a/libvirt-glib/libvirt-glib-event.c b/libvirt-glib/libvirt-glib-event.c
index 657c1bf..2a9ee23 100644
--- a/libvirt-glib/libvirt-glib-event.c
+++ b/libvirt-glib/libvirt-glib-event.c
@@ -256,13 +256,11 @@ _event_handle_remove(gpointer data)
 {
     struct gvir_event_handle *h = data;
 
-    g_mutex_lock(eventlock);
-
     if (h->ff)
         (h->ff)(h->opaque);
 
+    g_mutex_lock(eventlock);
     g_ptr_array_remove_fast(handles, h);
-
     g_mutex_unlock(eventlock);
 
     return FALSE;
@@ -414,13 +412,11 @@ _event_timeout_remove(gpointer data)
 {
     struct gvir_event_timeout *t = data;
 
-    g_mutex_lock(eventlock);
-
     if (t->ff)
         (t->ff)(t->opaque);
 
+    g_mutex_lock(eventlock);
     g_ptr_array_remove_fast(timeouts, t);
-
     g_mutex_unlock(eventlock);
 
     return FALSE;
-- 
1.7.11.2




More information about the libvir-list mailing list