|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] [PATCH 27/28] libxl: ocaml: add VM lifecycle operations
> > +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);
>
> Create/allocate the json and immediately free it? (left over debug
> perhaps?)
Yes :(
I will remove it.
> > + libxl_event_free(CTX, *event_r);
> > + continue;
> > + }
> > + return ret;
> > + }
> > +}
> [...]
> > +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");
>
> This exits asynchronously, which leaves the domain death event enabled.
> Depending on what your exception handler does this may not be what you
> want?
I think it is best to cleanup here itself. I'll fix that.
> This case has only just occurred to me, so there may be other instances in
> earlier patches...
I have looked through the code and indeed found a few more instances where
cleanup is needed before raising an exception.
Cheers,
Rob
> > +
> > + 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);
> > +}
>
> This and the rest look pretty mechanical, I just skimmed it...
>
> Ian.
_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxx
http://lists.xen.org/xen-devel
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |