virLXCController *ctrl = virNetServerClientGetPrivateData(client);
VIR_DEBUG("Client %p has closed", client);
- if (ctrl->client == client)
+ if (ctrl->client == client) {
ctrl->client = NULL;
+ VIR_DEBUG("Client has gone away");
+ }
if (ctrl->inShutdown) {
VIR_DEBUG("Arm timer to quit event loop");
virEventUpdateTimeout(ctrl->timerShutdown, 0);
static bool wantReboot;
static virMutex lock = VIR_MUTEX_INITIALIZER;
+static int
+virLXCControllerEventSendExit(virLXCController *ctrl,
+ int exitstatus);
-static void virLXCControllerSignalChildIO(virNetDaemon *dmn,
+static void virLXCControllerSignalChildIO(virNetDaemon *dmn G_GNUC_UNUSED,
siginfo_t *info G_GNUC_UNUSED,
void *opaque)
{
ret = waitpid(-1, &status, WNOHANG);
VIR_DEBUG("Got sig child %d vs %lld", ret, (long long)ctrl->initpid);
if (ret == ctrl->initpid) {
- virNetDaemonQuit(dmn);
virMutexLock(&lock);
if (WIFSIGNALED(status) &&
WTERMSIG(status) == SIGHUP) {
wantReboot = true;
}
virMutexUnlock(&lock);
+ virLXCControllerEventSendExit(ctrl, wantReboot ? 1 : 0);
}
}
VIR_DEBUG("Waiting for client to complete dispatch");
ctrl->inShutdown = true;
virNetServerClientDelayedClose(ctrl->client);
- virNetDaemonRun(ctrl->daemon);
+ } else {
+ VIR_DEBUG("Arm timer to quit event loop");
+ virEventUpdateTimeout(ctrl->timerShutdown, 0);
}
- VIR_DEBUG("Client has gone away");
return 0;
}
rc = virLXCControllerMain(ctrl);
- virLXCControllerEventSendExit(ctrl, rc);
-
cleanup:
VIR_FORCE_CLOSE(control[0]);
VIR_FORCE_CLOSE(control[1]);