[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] [PATCH v2 3/3] libxl: ocaml: use 'for_app_registration' in osevent callbacks
Rob Hoes writes ("[PATCH v2 3/3] libxl: ocaml: use 'for_app_registration' in osevent callbacks"): > This allows the application to pass a token to libxl in the fd/timeout > registration callbacks, which it receives back in modification or > deregistration callbacks. > > It turns out that this is essential for timeout handling, in order to > identify which timeout to change on a modify event. > > Signed-off-by: Rob Hoes <rob.hoes@xxxxxxxxxx> ... > - caml_callbackN(*func, 4, args); > + for_app = malloc(sizeof(value)); > + if (!for_app) { > + ret = ERROR_OSEVENT_REG_FAIL; > + goto err; > + } > + > + *for_app = caml_callbackN_exn(*func, 4, args); > + if (Is_exception_result(*for_app)) { > + ret = ERROR_OSEVENT_REG_FAIL; > + goto err; > + } > + > + caml_register_global_root(for_app); > + *for_app_registration_out = for_app; I expect you have thought this through properly, and perhaps even explained it already, but: is the ordering of these operations (particularly, of the caml_register_global_root) guaranteed to be correct ? Eg, can Is_exception_result call the gc ? > int fd_modify(void *user, int fd, void **for_app_registration_update, > @@ -1241,9 +1263,14 @@ int fd_modify(void *user, int fd, void > **for_app_registration_update, > { ... > + /* If for_app == NULL, assume that something is wrong */ > + assert(for_app); While I'm reading this in detail, this is a slightly odd wording for the comment, now that this is an assertion. You probably mean something like "If for_app == NULL, something is very wrong". (Another occurrence of this later.) > void fd_deregister(void *user, int fd, void *for_app_registration) > { ... > + caml_callbackN_exn(*func, 3, args); > + /* If the callback were to raise an exception, this will be ignored; > + * this hook does not return error codes */ Can you not do anything better here ? I think crashing the whole application would be better than carrying on and later calling back into libxl with a stale for_libxl pointer! > - caml_callbackN(*func, 4, args); > + for_app = malloc(sizeof(value)); > + if (!for_app) { > + ret = ERROR_OSEVENT_REG_FAIL; > + goto err; > + } > + > + *for_app = caml_callbackN_exn(*func, 4, args); > + if (Is_exception_result(*for_app)) { > + ret = ERROR_OSEVENT_REG_FAIL; > + goto err; > + } > + > + caml_register_global_root(for_app); > + *for_app_registration_out = for_app; Aren't these functions getting incredibly formulaic ? I guess it is too late for 4.4 but if possible, later, I would like to see the common stuff factored out. > int timeout_modify(void *user, void **for_app_registration_update, > @@ -1315,18 +1382,43 @@ int timeout_modify(void *user, void > **for_app_registration_update, > { > caml_leave_blocking_section(); > CAMLparam0(); > + CAMLlocalN(args, 2); > + int ret = 0; ... > + /* This modify hook causes the timeout to fire immediately. Deregister > + * won't be called, so we clean up our GC registration here. */ > + caml_remove_global_root(for_app); > + free(for_app); > + *for_app_registration_update = NULL; This can't be right, because what the timeout modify callback is supposed to do is arrange for stub_libxl_osevent_occurred_timeout to be called. And looking at that, I see that stub_libxl_osevent_occurred_timeout doesn't destroy the for_app. Ian. _______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxx http://lists.xen.org/xen-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |