[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [Xen-devel] [PATCH 22/28] libxl: ocaml: event management



> > > +value stub_xl_osevent_register_hooks(value ctx, value user) {
> > > + CAMLparam2(ctx, user);
> > > + libxl_osevent_hooks *hooks;
> > > + hooks = malloc(sizeof(*hooks));
> > > +
> > > + hooks->fd_register = fd_register;
> > > + hooks->fd_modify = fd_modify;
> > > + hooks->fd_deregister = fd_deregister;
> > > + hooks->timeout_register = timeout_register;
> > > + hooks->timeout_modify = timeout_modify;
> > > + hooks->timeout_deregister = timeout_deregister;
> > > +
> > > + libxl_osevent_register_hooks(CTX, hooks, (void *) user);
> > 
> > This user thing will be retained by libxl -- is that safe from an ocaml gc 
> > point
> > of view?
> 
> Good point. The original value may go out of scope in the OCaml program and 
> will then be GC'ed. We should copy the value to avoid trouble. To do that, 
> though, we need to know the type of the thing, which is currently 
> polymorphic. I'll just go ahead and make it a string instead, because that 
> seems to be the most useful.
> 
> Are these hooks and associated data every cleaned up by libxl? Or is the 
> assumption that libxl_osevent_register_hooks is just called once at the 
> beginning of the program, and everything starts till the end?

>From the doc comment (libxl_event.h line 353):
  * osevent_register_hooks may be called only once for each libxl_ctx.
So you are not allowed to call it with NULL to deregister or change
the hooks.

The "user" should normally be a pointer whatever structure you have
that contains the libxl_ctx*.

> > > +void event_occurs(void *user, const libxl_event *event) {
> > > + CAMLparam0();
> > > + CAMLlocalN(args, 2);
> > > + value *func = caml_named_value("xl_event_occurs_callback");
> > > +
> > > + args[0] = (value) user;
> > > + args[1] = Val_event((libxl_event *) event);
> > > + //libxl_event_free(CTX, event); // no ctx here!
> > 
> > Is it leaked or do you free it somewhere else? I suppose "func" must do it?
> > (which makes sense actually)
> 
> Hmm... This is awkward. The thing we are giving to "func" is the event 
> translated into an Ocaml type, and not the C libxl_event*. And even if we 
> give the libxl_event* to "func" as well, it still needs to know the ctx in 
> order to free it (which it probably would, but won't make things easier to 
> use). Is there no way to ask libxl to which ctx the event belongs?

No, there isn't such a way.  Indeed it's not recorded.

I think part of the problem here is that you may be trying to map the
C functions to ocaml too directly.  Your ocaml system already has an
event loop, doesn't it ?  You should provide plumbing to glue it to
that.

Ian.

_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxx
http://lists.xen.org/xen-devel


 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.