[Libguestfs] [PATCH 02/27] daemon: Allow parts of the daemon and APIs to be written in OCaml.

Pino Toscano ptoscano at redhat.com
Thu Jul 20 11:44:14 UTC 2017


On Wednesday, 19 July 2017 22:25:41 CEST Richard W.M. Jones wrote:
> On Wed, Jul 19, 2017 at 03:13:47PM +0200, Pino Toscano wrote:
> > On Friday, 14 July 2017 15:39:10 CEST Richard W.M. Jones wrote:
> > >  .gitignore                 |   6 +-
> > >  Makefile.am                |   2 +-
> > >  common/mlutils/Makefile.am |   4 -
> > >  daemon/Makefile.am         | 103 +++++++++++++++++++++++--
> > >  daemon/chroot.ml           |  85 +++++++++++++++++++++
> > >  daemon/chroot.mli          |  35 +++++++++
> > >  daemon/daemon-c.c          |  35 +++++++++
> > >  daemon/daemon.ml           |  39 ++++++++++
> > >  daemon/guestfsd.c          |  50 ++++++++++++
> > >  daemon/sysroot-c.c         |  37 +++++++++
> > >  daemon/sysroot.ml          |  19 +++++
> > >  daemon/sysroot.mli         |  22 ++++++
> > >  daemon/utils.ml            | 156 +++++++++++++++++++++++++++++++++++++
> > >  daemon/utils.mli           |  65 ++++++++++++++++
> > 
> > TBH I'd just have a single "Daemon" module for the OCaml helpers for
> > the daemon, instead of different modules, wirh a single -c.c file for
> > all the C implementations.  The Sysroot submodule could be implemented
> > like the various submodules in Unix_utils.
> 
> Do you mean Daemon.Chroot, Daemon.Sysroot etc?

Yes, exactly.

> > > +val f : t -> ('a -> 'b) -> 'a -> 'b
> > > +(** Run a function in the chroot, returning the result or re-raising
> > > +    any exception thrown. *)
> > 
> > After reading patch #11, IMHO there should be a variant that takes a
> > generic (unit -> unit) function (called 'fn', maybe?), and have 'f'
> > use it:
> > 
> >   let f t fun arg =
> >     f (fun () -> fun arg)
> 
> I'm a bit confused, do you have a compilable example?

Not really without rewriting all of it, but I can improve the snippets.

An interface like:
  val f : t -> ('a -> 'b) -> 'a -> 'b
  val fn : t -> (unit -> unit) -> 'a

With the implementation like:
  let f t func arg =
    fn (fun () -> func arg)
  let fn func =
    ...
      let ret =
        try Either (func ())
        with exn -> Or exn in

This way, when calling more more than a single-parameter function, it
is slightly easier to read (IMHO, of course):

  let res = Chroot.f chroot (fun () -> ...) in

than

  let res = Chroot.f chroot (fun () -> ...) () in

This is mostly syntactic sugar.

> > > +/* Convert an OCaml exception to a reply_with_error_errno call
> > > + * as best we can.
> > > + */
> > > +extern void ocaml_exn_to_reply_with_error (const char *func, value exn);
> > > +
> > > +void
> > > +ocaml_exn_to_reply_with_error (const char *func, value exn)
> > > +{
> > 
> > Shouldn't this use CAMLparam1 + CAMLreturn?
> 
> It doesn't allocate on the OCaml heap so it should be safe.
> 
> > > +let udev_settle ?filename () =
> > 
> > Ditto.
> 
> ‘Ditto’ means bind the C udev_settle_* functions?

Yes, that's correct.

-- 
Pino Toscano
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 819 bytes
Desc: This is a digitally signed message part.
URL: <http://listman.redhat.com/archives/libguestfs/attachments/20170720/e96e3c7f/attachment.sig>


More information about the Libguestfs mailing list