state = libxl__xs_read(gc, XBT_NULL, path);
if (state != NULL && !strcmp(state, "paused")) {
libxl__qemu_traditional_cmd(gc, domid, "continue");
- libxl__wait_for_device_model(gc, domid, "running",
+ libxl__wait_for_device_model_deprecated(gc, domid, "running",
NULL, NULL, NULL);
}
}
return;
}
-int libxl__wait_for_device_model(libxl__gc *gc,
+int libxl__wait_for_device_model_deprecated(libxl__gc *gc,
uint32_t domid, char *state,
libxl__spawn_starting *spawning,
int (*check_callback)(libxl__gc *gc,
{
char *path;
path = GCSPRINTF("/local/domain/0/device-model/%d/state", domid);
- return libxl__wait_for_offspring(gc, domid,
+ return libxl__xenstore_child_wait_deprecated(gc, domid,
LIBXL_DEVICE_MODEL_START_TIMEOUT,
"Device Model", path, state, spawning,
check_callback, check_callback_userdata);
case LIBXL_DEVICE_MODEL_VERSION_QEMU_XEN_TRADITIONAL: {
LOG(DEBUG, "Saving device model state to %s", filename);
libxl__qemu_traditional_cmd(gc, domid, "save");
- libxl__wait_for_device_model(gc, domid, "paused", NULL, NULL, NULL);
+ libxl__wait_for_device_model_deprecated(gc, domid, "paused", NULL, NULL, NULL);
break;
}
case LIBXL_DEVICE_MODEL_VERSION_QEMU_XEN:
switch (libxl__device_model_version_running(gc, domid)) {
case LIBXL_DEVICE_MODEL_VERSION_QEMU_XEN_TRADITIONAL: {
libxl__qemu_traditional_cmd(gc, domid, "continue");
- libxl__wait_for_device_model(gc, domid, "running", NULL, NULL, NULL);
+ libxl__wait_for_device_model_deprecated(gc, domid, "running", NULL, NULL, NULL);
break;
}
case LIBXL_DEVICE_MODEL_VERSION_QEMU_XEN:
return rc ? SIGTERM : 0;
}
-int libxl__wait_for_offspring(libxl__gc *gc,
+int libxl__xenstore_child_wait_deprecated(libxl__gc *gc,
uint32_t domid,
uint32_t timeout, char *what,
char *path, char *state,
pid_t innerchild);
/*
- * libxl__wait_for_offspring - Wait for child state
+ * libxl__xenstore_child_wait_deprecated - Wait for daemonic child IPC
+ *
+ * This is a NOT function for waiting for ordinary child processes.
+ * If you want to run (fork/exec/wait) subprocesses from libxl:
+ * - Make your libxl entrypoint use the ao machinery
+ * - Use libxl__ev_fork, and use the callback programming style
+ *
+ * This function is intended for interprocess communication with a
+ * service process. If the service process does not respond quickly,
+ * the whole caller may be blocked. Therefore this function is
+ * deprecated. This function is currently used only by
+ * libxl__wait_for_device_model_deprecated.
+ *
* gc: allocation pool
* domid: guest to work with
* timeout: how many seconds to wait for the state to appear
* in xenstore, and optionally for state in path.
* If path appears and state matches, check_callback is called.
* If check_callback returns > 0, waiting for path or state continues.
- * Otherwise libxl__wait_for_offspring returns.
+ * Otherwise libxl__xenstore_child_wait_deprecated returns.
*/
-_hidden int libxl__wait_for_offspring(libxl__gc *gc,
+_hidden int libxl__xenstore_child_wait_deprecated(libxl__gc *gc,
uint32_t domid,
uint32_t timeout, char *what,
char *path, char *state,
int nr_consoles, libxl__device_console *consoles,
int nr_vfbs, libxl_device_vfb *vfbs,
int nr_disks, libxl_device_disk *disks);
- /* Caller must either: pass starting_r==0, or on successful
- * return pass *starting_r (which will be non-0) to
- * libxl__confirm_device_model_startup or libxl__detach_device_model. */
-_hidden int libxl__wait_for_device_model(libxl__gc *gc,
+
+/*
+ * This function will cause the whole libxl process to hang
+ * if the device model does not respond. It is deprecated.
+ *
+ * Instead of calling this function:
+ * - Make your libxl entrypoint use the ao machinery
+ * - Use libxl__ev_xswatch_register, and use the callback programming
+ * style
+ */
+_hidden int libxl__wait_for_device_model_deprecated(libxl__gc *gc,
uint32_t domid, char *state,
- libxl__spawn_starting *spawning,
+ libxl__spawn_starting *spawning
+ /* NULL allowed */,
int (*check_callback)(libxl__gc *gc,
uint32_t domid,
const char *state,
}
libxl__qemu_traditional_cmd(gc, domid, "pci-ins");
- rc = libxl__wait_for_device_model(gc, domid, NULL, NULL,
+ rc = libxl__wait_for_device_model_deprecated(gc, domid, NULL, NULL,
pci_ins_check, state);
path = libxl__sprintf(gc, "/local/domain/0/device-model/%d/parameter",
domid);
switch (libxl__domain_type(gc, domid)) {
case LIBXL_DOMAIN_TYPE_HVM:
hvm = 1;
- if (libxl__wait_for_device_model(gc, domid, "running",
+ if (libxl__wait_for_device_model_deprecated(gc, domid, "running",
NULL, NULL, NULL) < 0) {
return ERROR_FAIL;
}
* device-model for function 0 */
if ( !force && (pcidev->vdevfn & 0x7) == 0 ) {
libxl__qemu_traditional_cmd(gc, domid, "pci-rem");
- if (libxl__wait_for_device_model(gc, domid, "pci-removed",
+ if (libxl__wait_for_device_model_deprecated(gc, domid, "pci-removed",
NULL, NULL, NULL) < 0) {
LIBXL__LOG(ctx, LIBXL__LOG_ERROR, "Device Model didn't respond in time");
/* This depends on guest operating system acknowledging the
switch (libxl__domain_type(gc, domid)) {
case LIBXL_DOMAIN_TYPE_HVM:
hvm = 1;
- if (libxl__wait_for_device_model(gc, domid, "running",
+ if (libxl__wait_for_device_model_deprecated(gc, domid, "running",
NULL, NULL, NULL) < 0)
goto out_fail;