#include "datatypes.h"
#include "ch_conf.h"
+#include "ch_domain.h"
#include "ch_events.h"
#include "ch_interface.h"
#include "ch_monitor.h"
#include "virfile.h"
#include "virjson.h"
#include "virlog.h"
+#include "virpidfile.h"
#include "virstring.h"
#define VIR_FROM_THIS VIR_FROM_CH
virCHMonitor *
virCHMonitorNew(virDomainObj *vm, virCHDriverConfig *cfg, int logfile)
{
+ virCHDomainObjPrivate *priv = vm->privateData;
g_autoptr(virCHMonitor) mon = NULL;
g_autoptr(virCommand) cmd = NULL;
int socket_fd = 0;
int event_monitor_fd;
+ int rv;
if (virCHMonitorInitialize() < 0)
return NULL;
virCommandSetErrorFD(cmd, &logfile);
virCommandNonblockingFDs(cmd);
virCommandSetUmask(cmd, 0x002);
+
socket_fd = chMonitorCreateSocket(mon->socketpath);
if (socket_fd < 0) {
virReportSystemError(errno,
virCommandAddArg(cmd, "--api-socket");
virCommandAddArgFormat(cmd, "fd=%d", socket_fd);
virCommandPassFD(cmd, socket_fd, VIR_COMMAND_PASS_FD_CLOSE_PARENT);
-
virCommandAddArg(cmd, "--event-monitor");
virCommandAddArgFormat(cmd, "path=%s", mon->eventmonitorpath);
+ virCommandSetPidFile(cmd, priv->pidfile);
+ virCommandDaemonize(cmd);
/* launch Cloud-Hypervisor socket */
- if (virCommandRunAsync(cmd, &mon->pid) < 0)
+ if (virCommandRun(cmd, NULL) < 0) {
+ VIR_DEBUG("CH vm=%p name=%s failed to spawn",
+ vm, vm->def->name);
+ return NULL;
+ }
+
+ if ((rv = virPidFileReadPath(priv->pidfile, &mon->pid)) < 0) {
+ virReportSystemError(-rv,
+ _("Domain %1$s didn't show up"),
+ vm->def->name);
return NULL;
+ }
+ VIR_DEBUG("CH vm=%p name=%s running with pid=%lld",
+ vm, vm->def->name, (long long)mon->pid);
/* open the reader end of fifo before start Event Handler */
while ((event_monitor_fd = open(mon->eventmonitorpath, O_RDONLY)) < 0) {
#include "virjson.h"
#include "virlog.h"
#include "virnuma.h"
+#include "virpidfile.h"
#include "virstring.h"
#include "ch_interface.h"
#include "ch_hostdev.h"
if (virCHHostdevPrepareDomainDevices(driver, vm->def, hostdev_flags) < 0)
return -1;
+ VIR_FREE(priv->pidfile);
+ if (!(priv->pidfile = virPidFileBuildPath(cfg->stateDir, vm->def->name))) {
+ virReportSystemError(errno, "%s",
+ _("Failed to build pidfile path."));
+ return -1;
+ }
+
+ if (unlink(priv->pidfile) < 0 &&
+ errno != ENOENT) {
+ virReportSystemError(errno,
+ _("Cannot remove stale PID file %1$s"),
+ priv->pidfile);
+ return -1;
+ }
+
/* Ensure no historical cgroup for this VM is lying around */
VIR_DEBUG("Ensuring no historical cgroup is lying around");
virDomainCgroupRemoveCgroup(vm, priv->cgroup, priv->machineName);
vm->def->id = -1;
g_clear_pointer(&priv->machineName, g_free);
+ if (priv->pidfile) {
+ if (unlink(priv->pidfile) < 0 &&
+ errno != ENOENT)
+ VIR_WARN("Failed to remove PID file for %s: %s",
+ vm->def->name, g_strerror(errno));
+
+ g_clear_pointer(&priv->pidfile, g_free);
+ }
+
virDomainObjSetState(vm, VIR_DOMAIN_SHUTOFF, reason);
virHostdevReAttachDomainDevices(driver->hostdevMgr, CH_DRIVER_NAME, def,