<div dir="ltr"><div><div><div><div>Hello,<br><br></div>thank for your reply, it allow me partially resolve problem: code works on x86 without any problems (yet with Gc.compact() calls insert after each line of code). But ARM version allways raises CallToExpiredClosure on the first call to callback.<br></div>I've tried next variants to store callback if struct field:<br></div><div>- existing toplevel function by name<br></div><div>- store function name to toplevel ref and save it to struct field by !ref_name<br></div><div>- by register closure to function (fun a b c d -> top_level_function a b c d) with Ctypes.Root.create<br></div><div>- by store same closure to Hashtbl.<br></div><div>- by register finaliser with Gc.finalise for closure (and it has not been called)<br></div><div>All this variants work on x86 and do not work on ARM, i.e. first call to OCaml callback from C raises CallToExpiredClosure.</div>It seems I don't understand problem at all.<br><br></div><div>So here is base questions:<br>- in case I store in C struct field existing toplevel function by name, may it be GC'ed?<br>-what may cause CallToExpiredClosure raise too if I has only one callback to call and at C side this struct in GDB seems to be correct?<br></div><div><br></div>WBR, ssp<br></div><div class="gmail_extra"><br><div class="gmail_quote">2017-05-04 23:24 GMT+05:00 Daniel Bünzli <span dir="ltr"><<a href="mailto:daniel.buenzli@erratique.ch" target="_blank">daniel.buenzli@erratique.ch</a>></span>:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><span class="">On Thursday, 4 May 2017 at 19:50, Serge Sivkov wrote:<br>
> How can I protect struct handler and fhandler function pointer from garbage collection?<br>
<br>
</span>I recently struggled with this on test code aswell. One thing that seems to work quite well is to store them in a toplevel  reference.<br>
<br>
let fhandler = ref fhandler<br>
<br>
Best,<br>
<br>
Daniel<br>
<br>
<br>
</blockquote></div><br></div>