return;
}
- if (kev.filter == EVFILT_PROC && (kev.fflags & NOTE_EXIT) != 0) {
- if ((pid_t)kev.ident != vm->pid) {
- virReportError(VIR_ERR_INTERNAL_ERROR,
- _("event from unexpected proc %1$ju!=%2$ju"),
- (uintmax_t)vm->pid, (uintmax_t)kev.ident);
- return;
- }
+ if (kev.filter != EVFILT_PROC || (kev.fflags & NOTE_EXIT) == 0)
+ return;
+
+ virObjectLock(vm);
+
+ if ((pid_t)kev.ident != vm->pid) {
+ virReportError(VIR_ERR_INTERNAL_ERROR,
+ _("event from unexpected proc %1$ju!=%2$ju"),
+ (uintmax_t)vm->pid, (uintmax_t)kev.ident);
+ goto cleanup;
+ }
- name = vm->def->name;
- status = kev.data;
- if (WIFSIGNALED(status) && WCOREDUMP(status)) {
- virReportError(VIR_ERR_INTERNAL_ERROR,
- _("Guest %1$s got signal %2$d and crashed"),
- name, WTERMSIG(status));
- virBhyveProcessStop(driver, vm, VIR_DOMAIN_SHUTOFF_CRASHED, false);
- } else if (WIFEXITED(status)) {
- if (WEXITSTATUS(status) == 0 || mon->reboot) {
- /* 0 - reboot */
- VIR_INFO("Guest %s rebooted; restarting domain.", name);
- virBhyveProcessRestart(driver, vm);
- } else if (WEXITSTATUS(status) < 3) {
- /* 1 - shutdown, 2 - halt, 3 - triple fault. others - error */
- VIR_INFO("Guest %s shut itself down; destroying domain.", name);
- virBhyveProcessStop(driver, vm, VIR_DOMAIN_SHUTOFF_SHUTDOWN, false);
- } else {
- VIR_INFO("Guest %s had an error and exited with status %d; destroying domain.",
- name, WEXITSTATUS(status));
- virBhyveProcessStop(driver, vm, VIR_DOMAIN_SHUTOFF_UNKNOWN, false);
- }
+ name = vm->def->name;
+ status = kev.data;
+ if (WIFSIGNALED(status) && WCOREDUMP(status)) {
+ virReportError(VIR_ERR_INTERNAL_ERROR,
+ _("Guest %1$s got signal %2$d and crashed"),
+ name, WTERMSIG(status));
+ virBhyveProcessStop(driver, vm, VIR_DOMAIN_SHUTOFF_CRASHED, false);
+ } else if (WIFEXITED(status)) {
+ if (WEXITSTATUS(status) == 0 || mon->reboot) {
+ /* 0 - reboot */
+ VIR_INFO("Guest %s rebooted; restarting domain.", name);
+ virBhyveProcessRestart(driver, vm);
+ } else if (WEXITSTATUS(status) < 3) {
+ /* 1 - shutdown, 2 - halt, 3 - triple fault. others - error */
+ VIR_INFO("Guest %s shut itself down; destroying domain.", name);
+ virBhyveProcessStop(driver, vm, VIR_DOMAIN_SHUTOFF_SHUTDOWN, false);
+ } else {
+ VIR_INFO("Guest %s had an error and exited with status %d; destroying domain.",
+ name, WEXITSTATUS(status));
+ virBhyveProcessStop(driver, vm, VIR_DOMAIN_SHUTOFF_UNKNOWN, false);
}
}
+
+ cleanup:
+ virObjectUnlock(vm);
}
static bhyveMonitor *