int virNetClientStreamEventRemoveCallback(virNetClientStreamPtr st) { int ret = -1; virObjectLock(st); if (!st->cb) { virReportError(VIR_ERR_INTERNAL_ERROR, "%s", _("no stream callback registered")); goto cleanup; } if (!st->cbDispatch && st->cbFree) (st->cbFree)(st->cbOpaque); st->cb = NULL; st->cbOpaque = NULL; st->cbFree = NULL; st->cbEvents = 0; virEventRemoveTimeout(st->cbTimer); ret = 0; cleanup: virObjectUnlock(st); return ret; }
/** * 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; }
void virNetServerClientDispose(void *obj) { virNetServerClientPtr client = obj; PROBE(RPC_SERVER_CLIENT_DISPOSE, "client=%p", client); virObjectUnref(client->identity); if (client->privateData && client->privateDataFreeFunc) client->privateDataFreeFunc(client->privateData); #if WITH_SASL virObjectUnref(client->sasl); #endif if (client->sockTimer > 0) virEventRemoveTimeout(client->sockTimer); #if WITH_GNUTLS virObjectUnref(client->tls); virObjectUnref(client->tlsCtxt); #endif virObjectUnref(client->sock); virObjectUnlock(client); }
static void virLXCControllerFree(virLXCControllerPtr ctrl) { size_t i; if (!ctrl) return; virLXCControllerStopInit(ctrl); virSecurityManagerFree(ctrl->securityManager); for (i = 0 ; i < ctrl->nveths ; i++) VIR_FREE(ctrl->veths[i]); VIR_FREE(ctrl->veths); for (i = 0 ; i < ctrl->nconsoles ; i++) virLXCControllerConsoleClose(&(ctrl->consoles[i])); VIR_FREE(ctrl->consoles); VIR_FORCE_CLOSE(ctrl->handshakeFd); VIR_FREE(ctrl->devptmx); virDomainDefFree(ctrl->def); VIR_FREE(ctrl->name); if (ctrl->timerShutdown != -1) virEventRemoveTimeout(ctrl->timerShutdown); virObjectUnref(ctrl->server); VIR_FREE(ctrl); }
/* * Deinitialize virsh */ static bool virshDeinit(vshControl *ctl) { virshControlPtr priv = ctl->privData; vshDeinit(ctl); VIR_FREE(ctl->connname); if (priv->conn) { int ret; virConnectUnregisterCloseCallback(priv->conn, virshCatchDisconnect); ret = virConnectClose(priv->conn); if (ret < 0) vshError(ctl, "%s", _("Failed to disconnect from the hypervisor")); else if (ret > 0) vshError(ctl, "%s", _("One or more references were leaked after " "disconnect from the hypervisor")); } virResetLastError(); if (ctl->eventLoopStarted) { int timer; virMutexLock(&ctl->lock); ctl->quit = true; /* HACK: Add a dummy timeout to break event loop */ timer = virEventAddTimeout(0, virshDeinitTimer, NULL, NULL); virMutexUnlock(&ctl->lock); virThreadJoin(&ctl->eventLoop); if (timer != -1) virEventRemoveTimeout(timer); if (ctl->eventTimerId != -1) virEventRemoveTimeout(ctl->eventTimerId); ctl->eventLoopStarted = false; } virMutexDestroy(&ctl->lock); return true; }
/** * virDomainEventStateFree: * @list: virDomainEventStatePtr to free * * Free a virDomainEventStatePtr and its members, and unregister the timer. */ void virDomainEventStateFree(virDomainEventStatePtr state) { if (!state) return; virDomainEventCallbackListFree(state->callbacks); virDomainEventQueueFree(state->queue); if (state->timer != -1) virEventRemoveTimeout(state->timer); VIR_FREE(state); }
/** * virObjectEventStateDispose: * @list: virObjectEventStatePtr to free * * Free a virObjectEventStatePtr and its members, and unregister the timer. */ static void virObjectEventStateDispose(void *obj) { virObjectEventStatePtr state = obj; VIR_DEBUG("obj=%p", state); virObjectEventCallbackListFree(state->callbacks); virObjectEventQueueFree(state->queue); if (state->timer != -1) virEventRemoveTimeout(state->timer); }
void qemuMonitorTestFree(qemuMonitorTestPtr test) { size_t i; int timer = -1; if (!test) return; virMutexLock(&test->lock); if (test->running) { test->quit = true; /* HACK: Add a dummy timeout to break event loop */ timer = virEventAddTimeout(0, qemuMonitorTestFreeTimer, NULL, NULL); } virMutexUnlock(&test->lock); if (test->client) { virNetSocketRemoveIOCallback(test->client); virNetSocketClose(test->client); virObjectUnref(test->client); } virObjectUnref(test->server); if (test->mon) { virObjectUnlock(test->mon); qemuMonitorClose(test->mon); } virObjectUnref(test->vm); virThreadJoin(&test->thread); if (timer != -1) virEventRemoveTimeout(timer); VIR_FREE(test->incoming); VIR_FREE(test->outgoing); for (i = 0 ; i < test->nitems ; i++) qemuMonitorTestItemFree(test->items[i]); VIR_FREE(test->items); if (test->tmpdir && rmdir(test->tmpdir) < 0) VIR_WARN("Failed to remove tempdir: %s", strerror(errno)); VIR_FREE(test->tmpdir); virMutexDestroy(&test->lock); VIR_FREE(test); }
/** * virObjectEventStateFree: * @list: virObjectEventStatePtr to free * * Free a virObjectEventStatePtr and its members, and unregister the timer. */ void virObjectEventStateFree(virObjectEventStatePtr state) { if (!state) return; virObjectEventCallbackListFree(state->callbacks); virObjectEventQueueFree(state->queue); if (state->timer != -1) virEventRemoveTimeout(state->timer); virMutexDestroy(&state->lock); VIR_FREE(state); }
void virKeepAliveStop(virKeepAlivePtr ka) { virObjectLock(ka); PROBE(RPC_KEEPALIVE_STOP, "ka=%p client=%p", ka, ka->client); if (ka->timer > 0) { virEventRemoveTimeout(ka->timer); ka->timer = -1; } virObjectUnlock(ka); }
/** * virObjectEventStateRegisterID: * @conn: connection to associate with callback * @state: domain event state * @uuid: uuid of the object for event filtering * @klass: the base event class * @eventID: ID of the event type to register for * @cb: function to invoke when event occurs * @opaque: data blob to pass to @callback * @freecb: callback to free @opaque * @legacy: true if callback is tracked by function instead of callbackID * @callbackID: filled with callback ID * @serverFilter: true if server supports object filtering * * Register the function @cb with connection @conn, from @state, for * events of type @eventID, and return the registration handle in * @callbackID. * * The return value is only important when registering client-side * mirroring of remote events (since the public API is documented to * return the callbackID rather than a count). A return of 1 means * that this is the first use of this type of event, so a remote event * must be enabled; a return larger than 1 means that an existing * remote event can already feed this callback. If @serverFilter is * false, the return count assumes that a single global remote feeds * both generic and per-object callbacks, and that the event queue * will be fed with virObjectEventStateQueue(). If it is true, then * the return count assumes that the remote side is capable of per- * object filtering; the user must call virObjectEventStateSetRemote() * to record the remote id, and queue events with * virObjectEventStateQueueRemote(). * * Returns: the number of callbacks now registered, or -1 on error. */ int virObjectEventStateRegisterID(virConnectPtr conn, virObjectEventStatePtr state, unsigned char *uuid, virObjectEventCallbackFilter filter, void *filter_opaque, virClassPtr klass, int eventID, virConnectObjectEventGenericCallback cb, void *opaque, virFreeCallback freecb, bool legacy, int *callbackID, bool serverFilter) { int ret = -1; virObjectEventStateLock(state); if ((state->callbacks->count == 0) && (state->timer == -1) && (state->timer = virEventAddTimeout(-1, virObjectEventTimer, state, NULL)) < 0) { virReportError(VIR_ERR_INTERNAL_ERROR, "%s", _("could not initialize domain event timer")); goto cleanup; } ret = virObjectEventCallbackListAddID(conn, state->callbacks, uuid, filter, filter_opaque, klass, eventID, cb, opaque, freecb, legacy, callbackID, serverFilter); if (ret == -1 && state->callbacks->count == 0 && state->timer != -1) { virEventRemoveTimeout(state->timer); state->timer = -1; } cleanup: virObjectEventStateUnlock(state); return ret; }
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); }
void virNetServerClientDispose(void *obj) { virNetServerClientPtr client = obj; if (client->privateData && client->privateDataFreeFunc) client->privateDataFreeFunc(client->privateData); VIR_FREE(client->identity); #if HAVE_SASL virObjectUnref(client->sasl); #endif if (client->sockTimer > 0) virEventRemoveTimeout(client->sockTimer); virObjectUnref(client->tls); virObjectUnref(client->tlsCtxt); virObjectUnref(client->sock); virNetServerClientUnlock(client); virMutexDestroy(&client->lock); }