d2c136b events: don't reschedule deleted timeouts/watches

Authored and Committed by fidencio 8 years ago
    events: don't reschedule deleted timeouts/watches
    
    The deletion of libvirt timeouts/watches is done in 2 steps:
    - the first step is synchronous and unregisters the timeout/watch
      from glib mainloop
    - the second step is asynchronous and triggered from the first step.
      It releases the memory used for bookkeeping for the timeout/watch
      being deleted
    
    This is done this way to avoid some possible deadlocks when
    reentering the sync callback while freeing the memory associated
    with the timeout/watch.
    
    However, it's possible to call gvir_event_update_handle after
    gvir_event_remove_handle but before _event_handle_remove does
    the final cleanup. When this happen, _update_handle will reregister
    the handle with glib mainloop, and bad things will happen when
    a glib callback is triggered for this event after _event_handle_remove
    has freed the memory associated with this handle watch.
    
    This commit marks the timeouts and watches as removed in the
    synchronous _remove callback and makes sure removed timeouts/watches
    are ignored in _update callbacks.
    
    Based on commit 3e73e0cee977fb20dd29db3ccfe85b00cc386c43 from
    libvirt-glib.
    Original author: Christophe Fergeau <cfergeau@redhat.com>
    
    Related to: rhbz#1243228
    
        
file modified
+14 -3