static void regs(libxl__gc *gc, int j) { int rc, i; LOG(DEBUG,"regs(%d)", j); for (i=0; i<NTIMES; i++) { rc = libxl__ev_time_register_rel(gc, &et[j][i], occurs, ms[j][i]); assert(!rc); } }
int libxl__xswait_start(libxl__gc *gc, libxl__xswait_state *xswa) { int rc; rc = libxl__ev_time_register_rel(xswa->ao, &xswa->time_ev, xswait_timeout_callback, xswa->timeout_ms); if (rc) goto err; rc = libxl__ev_xswatch_register(gc, &xswa->watch_ev, xswait_xswatch_callback, xswa->path); if (rc) goto err; return 0; err: libxl__xswait_stop(gc, xswa); return rc; }
int libxl__async_exec_start(libxl__async_exec_state *aes) { pid_t pid; /* Convenience aliases */ libxl__ao *ao = aes->ao; AO_GC; libxl__ev_child *const child = &aes->child; char ** const args = aes->args; aes->rc = 0; /* Set execution timeout */ if (libxl__ev_time_register_rel(ao, &aes->time, async_exec_timeout, aes->timeout_ms)) { LOG(ERROR, "unable to register timeout for executing: %s", aes->what); goto out; } LOG(DEBUG, "forking to execute: %s ", aes->what); /* Fork and exec */ pid = libxl__ev_child_fork(gc, child, async_exec_done); if (pid == -1) { LOG(ERROR, "unable to fork"); goto out; } if (!pid) { /* child */ libxl__exec(gc, aes->stdfds[0], aes->stdfds[1], aes->stdfds[2], args[0], args, aes->env); } return 0; out: return ERROR_FAIL; }
static void domain_suspend_switch_qemu_xen_traditional_logdirty (libxl__egc *egc, int domid, unsigned enable, libxl__logdirty_switch *lds) { STATE_AO_GC(lds->ao); int rc; xs_transaction_t t = 0; const char *got; if (!lds->cmd_path) { uint32_t dm_domid = libxl_get_stubdom_id(CTX, domid); lds->cmd_path = DEVICE_MODEL_XS_PATH(gc, dm_domid, domid, "/logdirty/cmd"); lds->ret_path = DEVICE_MODEL_XS_PATH(gc, dm_domid, domid, "/logdirty/ret"); } lds->cmd = enable ? "enable" : "disable"; rc = libxl__ev_xswatch_register(gc, &lds->watch, switch_logdirty_xswatch, lds->ret_path); if (rc) goto out; rc = libxl__ev_time_register_rel(ao, &lds->timeout, switch_logdirty_timeout, 10*1000); if (rc) goto out; for (;;) { rc = libxl__xs_transaction_start(gc, &t); if (rc) goto out; rc = libxl__xs_read_checked(gc, t, lds->cmd_path, &got); if (rc) goto out; if (got) { const char *got_ret; rc = libxl__xs_read_checked(gc, t, lds->ret_path, &got_ret); if (rc) goto out; if (!got_ret || strcmp(got, got_ret)) { LOG(ERROR,"controlling logdirty: qemu was already sent" " command `%s' (xenstore path `%s') but result is `%s'", got, lds->cmd_path, got_ret ? got_ret : "<none>"); rc = ERROR_FAIL; goto out; } rc = libxl__xs_rm_checked(gc, t, lds->cmd_path); if (rc) goto out; } rc = libxl__xs_rm_checked(gc, t, lds->ret_path); if (rc) goto out; rc = libxl__xs_write_checked(gc, t, lds->cmd_path, lds->cmd); if (rc) goto out; rc = libxl__xs_transaction_commit(gc, &t); if (!rc) break; if (rc<0) goto out; } /* OK, wait for some callback */ return; out: LOG(ERROR,"logdirty switch failed (rc=%d), abandoning suspend",rc); libxl__xs_transaction_abort(gc, &t); switch_logdirty_done(egc,lds,rc); }