Dear all, We are experiencing crashes in Caml-calling C code. This happens if garbage collection runs after Caml code has raised an exception. We now understand why this happens but we are puzzled as to why the "Interfacing C with Ocaml" chapter of the Ocaml manual doesn't warn about this situation.
Suppose you have C code that calls Caml code as follows: … CAMLparam2(v1,v2); CAMLlocal2(…,res); res = callback2_exn(…,v1,v2); foobar(); … We have found that this code will crash with "Fatal error: out of memory." if the following two things happen: * the function called by [callback2_exn] raises an exception, and * [foobar] triggers a garbage collection through the allocation of values in the Caml heap. (just calling [caml_gc_full_major] is enough to cause the crash). The reason for this crash is that [res] will contain an invalid pointer if an exception is thrown. The GC follows this bogus pointer ([res] is registered as a root by [CAMLlocal2]) which ultimately causes a crash in the GC code. Why does [res] contain a bogus pointer? It's not really a bogus pointer, but the lower bits are tagged in order to denote a thrown exception. These bits are usually tested/cleared by [Is_exception_result] and [Extract_exception]. We observed all this in an x86_64 platform but I can imagine this also happens in other platforms. We are using Ocaml 3.12 and Ubuntu 11.10. The example program is based on the one given at http://caml.inria.fr/pub/docs/oreilly-book/html/book-ora117.html We could do something like this to avoid the problem: … CAMLparam2(v1,v2); CAMLlocal2(…,res); bool was_exn=false; res = callback2_exn(…,v1,v2); if(Is_exception_result(res)) { was_exn=true; res = Extract_exception(res); } foobar(); // Now it's safe to Caml-allocate in foobar … It's a bit ugly but it could be encapsulated in a macro. The question I have now is why isn't the GC+exn crash mentioned in the documentation? Is there some best practice that we are missing from the documentation? Cheers, Alexey -- Alexey Rodriguez Yakushev O +31 (0)40 8200960 | D + 31 (0)40 8200974 | F +31 (0)40 8200979 Vonderweg 22, 5616 RM | Eindhoven | The Netherlands www.vectorfabrics.com | ale...@vectorfabrics.com -- Caml-list mailing list. Subscription management and archives: https://sympa-roc.inria.fr/wws/info/caml-list Beginner's list: http://groups.yahoo.com/group/ocaml_beginners Bug reports: http://caml.inria.fr/bin/caml-bugs