/** * virObjectEventStateDeregisterID: * @conn: connection to associate with callback * @state: object event state * @callbackID: ID of the function to remove from event * * Unregister the function @callbackID with connection @conn, * from @state, for events. * * Returns: the number of callbacks still registered, or -1 on error */ int virObjectEventStateDeregisterID(virConnectPtr conn, virObjectEventStatePtr state, int callbackID) { int ret; virObjectEventStateLock(state); if (state->isDispatching) ret = virObjectEventCallbackListMarkDeleteID(conn, state->callbacks, callbackID); else ret = virObjectEventCallbackListRemoveID(conn, state->callbacks, callbackID); if (state->callbacks->count == 0 && state->timer != -1) { virEventRemoveTimeout(state->timer); state->timer = -1; virObjectEventQueueClear(state->queue); } virObjectEventStateUnlock(state); return ret; }
/** * virObjectEventQueueFree: * @queue: pointer to the queue * * Free the memory in the queue. We process this like a list here */ static void virObjectEventQueueFree(virObjectEventQueuePtr queue) { if (!queue) return; virObjectEventQueueClear(queue); VIR_FREE(queue); }
static void virObjectEventStateCleanupTimer(virObjectEventStatePtr state, bool clear_queue) { /* There are still some callbacks, keep the timer. */ if (state->callbacks->count) return; /* The timer is not registered, nothing to do. */ if (state->timer == -1) return; virEventRemoveTimeout(state->timer); state->timer = -1; if (clear_queue) virObjectEventQueueClear(state->queue); }