I have a library which emits events by calling a callback. I want to handle these events within my OCaml code, translating them into React.event if possible. Event callback is being called in a separate pthread. I expect it to call an OCaml callback asynchronously, though it doesn’t work.
I could write a blocking wrapper, but it would block my main OCaml thread and I could not wrap a function calling to OCaml into a Lwt_preemptive.
How to wrap something like this:
void event_source ((void)(*f)(void*)) {
while (TRUE) {
...
f (data);
}
}
in OCaml so it could be used within a Lwt scheduled asynchronous program?
You may be able to draw inspiration from ocaml-fdb, which tackles a similar challenge wrapping libfdb.
With libfdb, you register callbacks with the library, which are then invoked from a separate thread. Like you, I wanted to integrate with Lwt (and Async). ocaml-fdb uses Ctypes for the bindings, and automatically acquires the runtime lock for the OCaml callback. Lwt_unix.{make_notification,send_notification} (docs) is then used to run a function on the Lwt main thread rather than the libfdb thread. You can find more details in this issue from the Lwt Github repo.
Hope it helps 
That definitely helps, thanks. I recalled another lwt event loop wrapper, the gtk’s glib library. These two examples look sufficient.