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

Reply via email to