Re: [Ocamlfuse-devel] Lowlevel interface, anyone have time to write stubs?
Brought to you by:
applejack
From: Goswin v. B. <gos...@we...> - 2009-07-19 01:55:11
|
Vincenzo Ciancia <ci...@di...> writes: > Dear Goswin, > > I can't believe I took so much time to reply to you. As usual I am > very sorry and I hope you did not loose interest in the thing. > > Ocamlfuse has a new developer, who was my co-developer in relfs and in > general is more constant than me on things. The high level api has > been adjusted for compatibility with FUSE 2.7, even though many > operations are still missing. The low level api as usual lacks > manpower, but I promised to try to help you for that. You already know > that you can join the sf.net project as a developer whenever you want > (just tell me your sf.net user name when you feel like). Now let's get > to your old questions. I need more explanations on my side to get back > in the topic. > >> Instead of constructing a bunch of closures on the fly how about a >> slightly different concept? > > Which closures you mean? > >> In ocaml you define a user visible >> >> type ops = { >> init : unit -> unit; >> destroy : unit -> unit; >> lookup : int64 -> string -> entry; >> getattr : int64 -> (stats * float); >> } >> >> and have one fixed set of private callbacks: >> >> fuse_init : ops -> unit -> unit; >> fuse_destroy : ops -> unit -> unit; >> fuse_lookup : ops -> fuse_req -> int64 -> string -> unit; >> fuse_getattr : ops -> fuse_req -> int64 -> unit; >> ... >> >> let fuse_init ops () = ops.init () >> let fuse_getattr ops req inode = >> try >> let (stats, timeout) = ops.getattr inode >> in >> assert((fuse_reply_attr req stats timeout) = 0) >> with Error err -> assert((fuse_reply_err req err) = 0) >> >> >> The C code gets the "ops" passed down, tells the GC that it will keep >> it and passes it to fuse_lowlevel_new(). Then when a callback comes it >> it retrieves it with >> >> /** >> * Get the userdata from the request >> * >> * @param req request handle >> * @return the user data passed to fuse_lowlevel_new() >> */ >> void *fuse_req_userdata(fuse_req_t req); >> >> and passes it back up to the ml calbacks. > > I myself am a bit outside of the topic after so much time, but perhaps > fuse_req_userdata was simply not exposed at the time I wrote the > bindings (most of these low-level functions were exposed in response > to the needs of ocamlfuse and of the C# bindings, which suffered from > the same problems). Could you mock-up the call sequence you > expect/imagine, from when an event is received from the kernel by > libfuse, to when it is processed by the user-defined ocaml callback > and then back to the kernel? I just need a line per call and if it's C > or CAML land. That will be of great help. > > As soon as I understand what you mean we can try to change the current > high-level api that way, if it works, low-level should be similar. > > Vincenzo I started on my own lowlevel bindings and commited them to the ocaml forge: http://forge.ocamlcore.org/projects/libfuse-ocaml/ http://git.ocamlcore.org/libfuse-ocaml/libfuse-ocaml.git/ Maybe that best explains what I ment. MfG Goswin |