<div dir="ltr"><div><div><div><div>Hello,<br><br></div>I'm write program which uses C library with main event loop. So, I call init function of this library from ocaml code, register callback and call main loop of this library. After that monent, ocaml code will be called only from this library.</div><div><br></div><div>Here is some relevant lines of code:<br><br>let bus_handler = ptr void @-> size_t @-> ptr (ptr void) @-> ptr size_t @-> returning int<br><br>type handlers<br>let handlers: handlers structure typ = structure "handlers_t"<br><br>let topic_name = field handlers "topic_name" string<br>let topic_handler = field handlers "topic_handler" (funptr ~thread_registration:true bus_handler)<br>let topic_type = field handlers "topic_type" int<br>let () = seal handlers<br><br>let bus_init = foreign "bus_init" (int @-> ptr (ptr void) @-> returning int)<br>let loop = foreign "loop" (ptr void @-> returning int)<br>let register_server = foreign "register_server" (ptr void @-> string @-> ptr handlers @-> size_t @-> returning int)<br><br>let floop fhandler name () =<br>        let handler = make handlers in<br>        let () = (<br>                setf handler topic_name name;<br>                setf handler topic_handler fhandler;<br>                setf handler topic_type 0<br>        ) in<br>        let () = (<br>                (* Gc.compact (); #1 *)<br>                let r = bus_init 1 bus_ptr in <br>                Printf.printf "bus_init: %d\n" r<br>        ) in<br>        let r1 = register_server (!@ bus_ptr) name (addr handler) (of_int 1) in<br>        (* let () = Gc.compact () in #2 *)<br>        loop (!@ bus_ptr)<br><br>In case I comment out both calls to Gc.compact I see<br><br>Cannot find handler (Resource temporarily unavailable)<br>Cannot get address handler item (Resource temporarily unavailable)<br><br>after 100-200 test calls on x86 and I get CallToExpiredClosure on ARM just on the first test call.<br>In case I uncomment #1 or #2 code line with Gc.compact call I got same error (Cannot find handler ...) on first test call on x86 too. I've added</div><div><br>        let addr1 = Root.create fhandler in<br>        let addr2 = Root.create handler in<br></div><br>to begin of floop function but nothing changed on program behaviour under tests.<br></div>How can I protect struct handler and fhandler function pointer from garbage collection?<br><br></div>WBR, ssp<br></div>