#include "virfirmware.h"
#include "libxl_capabilities.h"
#include "libxl_logger.h"
+#include "virinhibitor.h"
#define LIBXL_DRIVER_EXTERNAL_NAME "Xen"
/*
/* pid file FD, ensures two copies of the driver can't use the same root */
int lockFD;
- /* Atomic inc/dec only */
- unsigned int nactive;
-
- /* Immutable pointers. Caller must provide locking */
- virStateInhibitCallback inhibitCallback;
- void *inhibitOpaque;
+ /* Immutable pointer, self-locking APIs */
+ virInhibitor *inhibitor;
/* Immutable pointer, self-locking APIs */
virDomainObjList *domains;
priv->deathW = NULL;
}
- if (g_atomic_int_dec_and_test(&driver->nactive) && driver->inhibitCallback)
- driver->inhibitCallback(false, driver->inhibitOpaque);
+ virInhibitorRelease(driver->inhibitor);
/* Release auto-allocated graphics ports */
for (i = 0; i < vm->def->ngraphics; i++) {
return -1;
}
- if (g_atomic_int_add(&driver->nactive, 1) == 0 && driver->inhibitCallback)
- driver->inhibitCallback(true, driver->inhibitOpaque);
+ virInhibitorHold(driver->inhibitor);
event = virDomainEventLifecycleNewFromObj(vm, VIR_DOMAIN_EVENT_STARTED,
restore_fd < 0 ?
virDomainObjSetState(vm, VIR_DOMAIN_RUNNING,
VIR_DOMAIN_RUNNING_UNKNOWN);
- if (g_atomic_int_add(&driver->nactive, 1) == 0 && driver->inhibitCallback)
- driver->inhibitCallback(true, driver->inhibitOpaque);
+ virInhibitorHold(driver->inhibitor);
/* Enable domain death events */
libxl_evenable_domain_death(cfg->ctx, vm->def->id, 0, &priv->deathW);
virObjectUnref(libxl_driver->domainEventState);
virSysinfoDefFree(libxl_driver->hostsysinfo);
+ virInhibitorFree(libxl_driver->inhibitor);
if (libxl_driver->lockFD != -1)
virPidFileRelease(libxl_driver->config->stateDir, "driver", libxl_driver->lockFD);
return VIR_DRV_STATE_INIT_ERROR;
}
- libxl_driver->inhibitCallback = callback;
- libxl_driver->inhibitOpaque = opaque;
-
/* Allocate bitmap for vnc port reservation */
if (!(libxl_driver->reservedGraphicsPorts =
virPortAllocatorRangeNew(_("VNC"),
if (libxlDriverConfigLoadFile(cfg, driverConf) < 0)
goto error;
+ libxl_driver->inhibitor = virInhibitorNew(
+ VIR_INHIBITOR_WHAT_NONE,
+ _("Libvirt Xen"),
+ _("Xen virtual machines are running"),
+ VIR_INHIBITOR_MODE_DELAY,
+ callback,
+ opaque);
+
/* Register the callbacks providing access to libvirt's event loop */
libxl_osevent_register_hooks(cfg->ctx, &libxl_osevent_callbacks, cfg->ctx);
#include "virsysinfo.h"
#include "virclosecallbacks.h"
#include "virhostdev.h"
+#include "virinhibitor.h"
#define LXC_DRIVER_NAME "LXC"
/* Immutable pointer, lockless APIs */
virSysinfoDef *hostsysinfo;
- /* Atomic inc/dec only */
- unsigned int nactive;
-
- /* Immutable pointers. Caller must provide locking */
- virStateInhibitCallback inhibitCallback;
- void *inhibitOpaque;
+ /* Immutable pointer, self-locking APIs */
+ virInhibitor *inhibitor;
/* Immutable pointer, self-locking APIs */
virDomainObjList *domains;
lxcStateInitialize(bool privileged,
const char *root,
bool monolithic G_GNUC_UNUSED,
- virStateInhibitCallback callback G_GNUC_UNUSED,
- void *opaque G_GNUC_UNUSED)
+ virStateInhibitCallback callback,
+ void *opaque)
{
virLXCDriverConfig *cfg = NULL;
bool autostart = true;
if (virLXCLoadDriverConfig(cfg, SYSCONFDIR "/libvirt/lxc.conf") < 0)
goto cleanup;
+ lxc_driver->inhibitor = virInhibitorNew(
+ VIR_INHIBITOR_WHAT_NONE,
+ _("Libvirt LXC"),
+ _("LXC containers are running"),
+ VIR_INHIBITOR_MODE_DELAY,
+ callback,
+ opaque);
+
if (!(lxc_driver->securityManager = lxcSecurityInit(cfg)))
goto cleanup;
virObjectUnref(lxc_driver->caps);
virObjectUnref(lxc_driver->securityManager);
virObjectUnref(lxc_driver->xmlopt);
+ virInhibitorFree(lxc_driver->inhibitor);
if (lxc_driver->lockFD != -1)
virPidFileRelease(lxc_driver->config->stateDir, "driver", lxc_driver->lockFD);
vm->pid = 0;
vm->def->id = -1;
- if (g_atomic_int_dec_and_test(&driver->nactive) && driver->inhibitCallback)
- driver->inhibitCallback(false, driver->inhibitOpaque);
+ virInhibitorRelease(driver->inhibitor);
virLXCDomainReAttachHostDevices(driver, vm->def);
if (virCommandHandshakeNotify(cmd) < 0)
goto cleanup;
- if (g_atomic_int_add(&driver->nactive, 1) == 0 && driver->inhibitCallback)
- driver->inhibitCallback(true, driver->inhibitOpaque);
+ virInhibitorHold(driver->inhibitor);
/* The first synchronization point is when the controller creates CGroups. */
if (lxcContainerWaitForContinue(handshakefds[0]) < 0) {
virDomainObjSetState(vm, VIR_DOMAIN_RUNNING,
VIR_DOMAIN_RUNNING_UNKNOWN);
- if (g_atomic_int_add(&driver->nactive, 1) == 0 && driver->inhibitCallback)
- driver->inhibitCallback(true, driver->inhibitOpaque);
+ virInhibitorHold(driver->inhibitor);
if (!(priv->monitor = virLXCProcessConnectMonitor(driver, vm)))
goto error;
if (virNetworkObjIsActive(obj)) {
virNetworkObjPortForEach(obj, networkUpdatePort, obj);
- if (g_atomic_int_add(&driver->nactive, 1) == 0 && driver->inhibitCallback)
- driver->inhibitCallback(true, driver->inhibitOpaque);
+ virInhibitorHold(driver->inhibitor);
}
/* Try and read dnsmasq pids of both active and inactive networks, just in
goto error;
}
- network_driver->inhibitCallback = callback;
- network_driver->inhibitOpaque = opaque;
-
network_driver->privileged = privileged;
if (!(network_driver->xmlopt = networkDnsmasqCreateXMLConf()))
if (!(network_driver->config = cfg = virNetworkDriverConfigNew(privileged)))
goto error;
+ network_driver->inhibitor = virInhibitorNew(
+ VIR_INHIBITOR_WHAT_NONE,
+ _("Libvirt Network"),
+ _("Virtual networks are active"),
+ VIR_INHIBITOR_MODE_DELAY,
+ callback,
+ opaque);
+
if ((network_driver->lockFD =
virPidFileAcquire(cfg->stateDir, "driver", getpid())) < 0)
goto error;
obj, network_driver->xmlopt) < 0)
goto cleanup;
- if (g_atomic_int_add(&driver->nactive, 1) == 0 && driver->inhibitCallback)
- driver->inhibitCallback(true, driver->inhibitOpaque);
+ virInhibitorHold(driver->inhibitor);
virNetworkObjSetActive(obj, true);
VIR_INFO("Network '%s' started up", def->name);
virNetworkObjSetActive(obj, false);
- if (g_atomic_int_dec_and_test(&driver->nactive) && driver->inhibitCallback)
- driver->inhibitCallback(false, driver->inhibitOpaque);
+ virInhibitorRelease(driver->inhibitor);
virNetworkObjUnsetDefTransient(obj);
return ret;
#include "virnetworkobj.h"
#include "object_event.h"
#include "virfirewall.h"
+#include "virinhibitor.h"
typedef struct _virNetworkDriverConfig virNetworkDriverConfig;
struct _virNetworkDriverConfig {
struct _virNetworkDriverState {
virMutex lock;
- /* Atomic inc/dec only */
- unsigned int nactive;
-
- /* Immutable pointers. Caller must provide locking */
- virStateInhibitCallback inhibitCallback;
- void *inhibitOpaque;
+ /* Immutable pointer, self-locking APIs */
+ virInhibitor *inhibitor;
/* Read-only */
bool privileged;
#include "virfile.h"
#include "virfilecache.h"
#include "virfirmware.h"
+#include "virinhibitor.h"
#define QEMU_DRIVER_NAME "QEMU"
/* Atomic increment only */
int lastvmid;
- /* Atomic inc/dec only */
- unsigned int nactive;
-
/* Immutable values */
bool privileged;
char *embeddedRoot;
- /* Immutable pointers. Caller must provide locking */
- virStateInhibitCallback inhibitCallback;
- void *inhibitOpaque;
+ /* Immutable pointer, self-locking APIs */
+ virInhibitor *inhibitor;
/* Immutable pointer, self-locking APIs */
virDomainObjList *domains;
return VIR_DRV_STATE_INIT_ERROR;
}
- qemu_driver->inhibitCallback = callback;
- qemu_driver->inhibitOpaque = opaque;
-
qemu_driver->privileged = privileged;
qemu_driver->hostarch = virArchFromHost();
if (root != NULL)
goto error;
}
+ qemu_driver->inhibitor = virInhibitorNew(
+ VIR_INHIBITOR_WHAT_NONE,
+ _("Libvirt QEMU"),
+ _("QEMU/KVM virtual machines are running"),
+ VIR_INHIBITOR_MODE_DELAY,
+ callback,
+ opaque);
+
if ((qemu_driver->lockFD =
virPidFileAcquire(cfg->stateDir, "driver", getpid())) < 0)
goto error;
ebtablesContextFree(qemu_driver->ebtables);
virObjectUnref(qemu_driver->domains);
virObjectUnref(qemu_driver->nbdkitCapsCache);
+ virInhibitorFree(qemu_driver->inhibitor);
if (qemu_driver->lockFD != -1)
virPidFileRelease(qemu_driver->config->stateDir, "driver", qemu_driver->lockFD);
qemuDomainSetFakeReboot(vm, false);
virDomainObjSetState(vm, VIR_DOMAIN_PAUSED, VIR_DOMAIN_PAUSED_STARTING_UP);
- if (g_atomic_int_add(&driver->nactive, 1) == 0 && driver->inhibitCallback)
- driver->inhibitCallback(true, driver->inhibitOpaque);
+ virInhibitorHold(driver->inhibitor);
/* Run an early hook to set-up missing devices */
if (qemuProcessStartHook(driver, vm,
if (priv->eventThread)
g_object_unref(g_steal_pointer(&priv->eventThread));
- if (g_atomic_int_dec_and_test(&driver->nactive) && driver->inhibitCallback)
- driver->inhibitCallback(false, driver->inhibitOpaque);
+ virInhibitorRelease(driver->inhibitor);
/* Clear network bandwidth */
virDomainClearNetBandwidth(vm->def);
goto error;
}
- if (g_atomic_int_add(&driver->nactive, 1) == 0 && driver->inhibitCallback)
- driver->inhibitCallback(true, driver->inhibitOpaque);
+ virInhibitorHold(driver->inhibitor);
cleanup:
if (jobStarted)
#include "viraccessapicheck.h"
#include "secret_event.h"
#include "virutil.h"
+#include "virinhibitor.h"
#define VIR_FROM_THIS VIR_FROM_SECRET
/* Immutable pointer, self-locking APIs */
virObjectEventState *secretEventState;
- /* Immutable pointers. Caller must provide locking */
- virStateInhibitCallback inhibitCallback;
- void *inhibitOpaque;
+ /* Immutable pointer, self-locking APIs */
+ virInhibitor *inhibitor;
};
static virSecretDriverState *driver;
}
-static bool
-secretNumOfEphemeralSecretsHelper(virConnectPtr conn G_GNUC_UNUSED,
- virSecretDef *def)
-{
- return def->isephemeral;
-}
-
-
-static int
-secretNumOfEphemeralSecrets(void)
-{
- return virSecretObjListNumOfSecrets(driver->secrets,
- secretNumOfEphemeralSecretsHelper,
- NULL);
-}
-
-
/* Driver functions */
static int
objDef->uuid,
objDef->usage_type,
objDef->usage_id);
+
+ if (objDef->isephemeral)
+ virInhibitorHold(driver->inhibitor);
+
goto cleanup;
restore_backup:
virSecretDefFree(def);
virSecretObjEndAPI(&obj);
- if (secretNumOfEphemeralSecrets() > 0)
- driver->inhibitCallback(true, driver->inhibitOpaque);
virObjectEventStateQueue(driver->secretEventState, event);
VIR_SECRET_EVENT_UNDEFINED,
0);
+ if (def->isephemeral)
+ virInhibitorRelease(driver->inhibitor);
+
virSecretObjDeleteData(obj);
virSecretObjListRemove(driver->secrets, obj);
cleanup:
virSecretObjEndAPI(&obj);
- if (secretNumOfEphemeralSecrets() == 0)
- driver->inhibitCallback(false, driver->inhibitOpaque);
-
virObjectEventStateQueue(driver->secretEventState, event);
return ret;
VIR_FREE(driver->configDir);
virObjectUnref(driver->secretEventState);
+ virInhibitorFree(driver->inhibitor);
if (driver->lockFD != -1)
virPidFileRelease(driver->stateDir, "driver", driver->lockFD);
driver->lockFD = -1;
driver->secretEventState = virObjectEventStateNew();
driver->privileged = privileged;
- driver->inhibitCallback = callback;
- driver->inhibitOpaque = opaque;
if (root) {
driver->embeddedRoot = g_strdup(root);
goto error;
}
+ driver->inhibitor = virInhibitorNew(
+ VIR_INHIBITOR_WHAT_NONE,
+ _("Libvirt Secret"),
+ _("Ephemeral secrets are loaded"),
+ VIR_INHIBITOR_MODE_DELAY,
+ callback,
+ opaque);
+
if ((driver->lockFD =
virPidFileAcquire(driver->stateDir, "driver", getpid())) < 0)
goto error;