|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: camlSys__entry vs. FreeBSD kmod
On 11 Jul 2012, at 14:34, PALI Gabor Janos wrote:
> On Wed, Jul 11, 2012 at 03:20:20PM +0200, PALI Gabor Janos wrote:
>> ...
>> caml_startup(NULL);
>> main_closure = caml_named_value("main");
>> if (!main_closure) bail_out();
>> caml_callback(*main_closure, Val_int(42));
>> ...
>
> Sorry, I have to correct myself: caml_startup() needs some sensible argument,
> i.e. a NULL-terminated array of strings. This is { "kmod", NULL } for now.
Yes, that's correct, and so is your approach of calling a closure back
from C into OCaml. The main-loop of the Xen kernel looks like this:
(from
https://github.com/mirage/mirage-platform/blob/master/xen/runtime/kernel/main.c)
> caml_startup(argv);
> v_main = caml_named_value("OS.Main.run");
> ASSERT(v_main != NULL);
> while (caml_completed == 0) {
> evtchn_poll();
> caml_completed = Bool_val(caml_callback(*v_main, Val_unit));
> }
>
We first initialise the runtime, which runs one iteration of the
program. However, this may leave a number of blocked cooperative threads,
and we do not yet have a return value.
The main thread loop, in the 'run' function:
https://github.com/mirage/mirage-platform/blob/master/xen/lib/main.ml
... will register the "OS.Main.run" callback when it is invoked, and
this callback will poll all the threads, and then return a boolean
indicating if they have all finished or not (and this is the caml_completed
loop in the C runtime).
So we'll need to do something similar with the kFreeBSD backend: the logic
is in the OS.Main.run module in mirage-platform (which implements an OS
module for either POSIX or Xen at the moment, and will have an extra
directory for kFreeBSD with your kernel-specific bindings in it).
Summary: the callbacks working and executing code in the kernel is a very
good thing! :)
-anil
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |