[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-devel] [PATCH 27/28] libxl: ocaml: add VM lifecycle operations
Signed-off-by: Rob Hoes <rob.hoes@xxxxxxxxxx> --- tools/ocaml/libs/xl/xenlight.ml.in | 10 ++ tools/ocaml/libs/xl/xenlight.mli.in | 10 ++ tools/ocaml/libs/xl/xenlight_stubs.c | 171 ++++++++++++++++++++++++++++++++++ 3 files changed, 191 insertions(+) diff --git a/tools/ocaml/libs/xl/xenlight.ml.in b/tools/ocaml/libs/xl/xenlight.ml.in index 96d6a38..5cd5204 100644 --- a/tools/ocaml/libs/xl/xenlight.ml.in +++ b/tools/ocaml/libs/xl/xenlight.ml.in @@ -86,6 +86,16 @@ type event = (* @@LIBXL_TYPES@@ *) +external domain_create_new : ctx -> Domain_config.t -> domid = "stub_xl_domain_create_new" +external domain_create_restore : ctx -> Domain_config.t -> Unix.file_descr -> domid = "stub_xl_domain_create_restore" +external domain_shutdown : ctx -> domid -> unit = "stub_libxl_domain_shutdown" +external domain_wait_shutdown : ctx -> domid -> unit = "stub_libxl_domain_wait_shutdown" +external domain_reboot : ctx -> domid -> unit = "stub_libxl_domain_reboot" +external domain_destroy : ctx -> domid -> unit = "stub_libxl_domain_destroy" +external domain_suspend : ctx -> domid -> Unix.file_descr -> unit = "stub_libxl_domain_suspend" +external domain_pause : ctx -> domid -> unit = "stub_libxl_domain_pause" +external domain_unpause : ctx -> domid -> unit = "stub_libxl_domain_unpause" + external send_trigger : ctx -> domid -> trigger -> int -> unit = "stub_xl_send_trigger" external send_sysrq : ctx -> domid -> char -> unit = "stub_xl_send_sysrq" external send_debug_keys : ctx -> string -> unit = "stub_xl_send_debug_keys" diff --git a/tools/ocaml/libs/xl/xenlight.mli.in b/tools/ocaml/libs/xl/xenlight.mli.in index d66f666..41713f3 100644 --- a/tools/ocaml/libs/xl/xenlight.mli.in +++ b/tools/ocaml/libs/xl/xenlight.mli.in @@ -58,6 +58,16 @@ type event = (* @@LIBXL_TYPES@@ *) +external domain_create_new : ctx -> Domain_config.t -> domid = "stub_xl_domain_create_new" +external domain_create_restore : ctx -> Domain_config.t -> Unix.file_descr -> domid = "stub_xl_domain_create_restore" +external domain_shutdown : ctx -> domid -> unit = "stub_libxl_domain_shutdown" +external domain_wait_shutdown : ctx -> domid -> unit = "stub_libxl_domain_wait_shutdown" +external domain_reboot : ctx -> domid -> unit = "stub_libxl_domain_reboot" +external domain_destroy : ctx -> domid -> unit = "stub_libxl_domain_destroy" +external domain_suspend : ctx -> domid -> Unix.file_descr -> unit = "stub_libxl_domain_suspend" +external domain_pause : ctx -> domid -> unit = "stub_libxl_domain_pause" +external domain_unpause : ctx -> domid -> unit = "stub_libxl_domain_unpause" + external send_trigger : ctx -> domid -> trigger -> int -> unit = "stub_xl_send_trigger" external send_sysrq : ctx -> domid -> char -> unit = "stub_xl_send_sysrq" external send_debug_keys : ctx -> string -> unit = "stub_xl_send_debug_keys" diff --git a/tools/ocaml/libs/xl/xenlight_stubs.c b/tools/ocaml/libs/xl/xenlight_stubs.c index f832f37..f3dd832 100644 --- a/tools/ocaml/libs/xl/xenlight_stubs.c +++ b/tools/ocaml/libs/xl/xenlight_stubs.c @@ -327,6 +327,177 @@ static char *String_option_val(value v) #include "_libxl_types.inc" +static int domain_wait_event(libxl_ctx *ctx, int domid, libxl_event **event_r) +{ + int ret; + for (;;) { + ret = libxl_event_wait(ctx, event_r, LIBXL_EVENTMASK_ALL, 0,0); + if (ret) { + return ret; + } + if ((*event_r)->domid != domid) { + char *evstr = libxl_event_to_json(CTX, *event_r); + free(evstr); + libxl_event_free(CTX, *event_r); + continue; + } + return ret; + } +} + +value stub_xl_domain_create_new(value ctx, value domain_config) +{ + CAMLparam2(ctx, domain_config); + int ret; + libxl_domain_config c_dconfig; + uint32_t c_domid; + + libxl_domain_config_init(&c_dconfig); + ret = domain_config_val(CTX, &c_dconfig, domain_config); + if (ret != 0) + failwith_xl(ret, "domain_create_new"); + + ret = libxl_domain_create_new(CTX, &c_dconfig, &c_domid, NULL, NULL); + if (ret != 0) + failwith_xl(ret, "domain_create_new"); + + libxl_domain_config_dispose(&c_dconfig); + + CAMLreturn(Val_int(c_domid)); +} + +value stub_xl_domain_create_restore(value ctx, value domain_config, value restore_fd) +{ + CAMLparam2(ctx, domain_config); + int ret; + libxl_domain_config c_dconfig; + uint32_t c_domid; + + ret = domain_config_val(CTX, &c_dconfig, domain_config); + if (ret != 0) + failwith_xl(ret, "domain_create_restore"); + + ret = libxl_domain_create_restore(CTX, &c_dconfig, &c_domid, Int_val(restore_fd), NULL, NULL); + if (ret != 0) + failwith_xl(ret, "domain_create_restore"); + + libxl_domain_config_dispose(&c_dconfig); + + CAMLreturn(Val_int(c_domid)); +} + +value stub_libxl_domain_wait_shutdown(value ctx, value domid) +{ + CAMLparam2(ctx, domid); + int ret; + libxl_event *event; + libxl_evgen_domain_death *deathw; + ret = libxl_evenable_domain_death(CTX, Int_val(domid), 0, &deathw); + if (ret) { + fprintf(stderr,"wait for death failed (evgen, rc=%d)\n",ret); + exit(-1); + } + + for (;;) { + ret = domain_wait_event(CTX, Int_val(domid), &event); + if (ret) + failwith_xl(ret, "domain_shutdown"); + + switch (event->type) { + case LIBXL_EVENT_TYPE_DOMAIN_DEATH: + goto done; + case LIBXL_EVENT_TYPE_DOMAIN_SHUTDOWN: + goto done; + default: + break; + } + libxl_event_free(CTX, event); + } +done: + libxl_event_free(CTX, event); + libxl_evdisable_domain_death(CTX, deathw); + + CAMLreturn(Val_unit); +} + +value stub_libxl_domain_shutdown(value ctx, value domid) +{ + CAMLparam2(ctx, domid); + int ret; + + ret = libxl_domain_shutdown(CTX, Int_val(domid)); + + if (ret != 0) + failwith_xl(ret, "domain_shutdown"); + + CAMLreturn(Val_unit); +} + +value stub_libxl_domain_reboot(value ctx, value domid) +{ + CAMLparam2(ctx, domid); + int ret; + + ret = libxl_domain_reboot(CTX, Int_val(domid)); + + if (ret != 0) + failwith_xl(ret, "domain_reboot"); + + CAMLreturn(Val_unit); +} + +value stub_libxl_domain_destroy(value ctx, value domid) +{ + CAMLparam2(ctx, domid); + int ret; + + ret = libxl_domain_destroy(CTX, Int_val(domid), 0); + + if (ret != 0) + failwith_xl(ret, "domain_destroy"); + + CAMLreturn(Val_unit); +} + +value stub_libxl_domain_suspend(value ctx, value domid, value fd) +{ + CAMLparam3(ctx, domid, fd); + int ret; + + ret = libxl_domain_suspend(CTX, Int_val(domid), Int_val(fd), 0, 0); + + if (ret != 0) + failwith_xl(ret, "domain_suspend"); + + CAMLreturn(Val_unit); +} + +value stub_libxl_domain_pause(value ctx, value domid) +{ + CAMLparam2(ctx, domid); + int ret; + + ret = libxl_domain_pause(CTX, Int_val(domid)); + + if (ret != 0) + failwith_xl(ret, "domain_pause"); + + CAMLreturn(Val_unit); +} + +value stub_libxl_domain_unpause(value ctx, value domid) +{ + CAMLparam2(ctx, domid); + int ret; + + ret = libxl_domain_unpause(CTX, Int_val(domid)); + + if (ret != 0) + failwith_xl(ret, "domain_unpause"); + + CAMLreturn(Val_unit); +} + void async_callback(libxl_ctx *ctx, int rc, void *for_callback) { int *task = (int *) for_callback; -- 1.7.10.4 _______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxx http://lists.xen.org/xen-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |