In order to avoid newly created OCaml values from being GC'ed, they must be
registered as roots with the GC, before an iteration of the GC may happen. The
Val_* functions potentially allocate new values on the OCaml heap, and may
trigger an iteration of the OCaml GC.
The way to register a value with the GC is to assign it to a variable declared
with a CAMLparam or CAMLlocal macro, which put the value into a struct that
can be reached from a GC root.
This leads to slightly weird looking C code, but avoids hard to find segfaults.
Signed-off-by: Rob Hoes <rob.hoes@citrix.com>
Acked-by: David Scott <dave.scott@eu.citrix.com>
Acked-by: Ian Campbell <ian.campbell@citrix.com>
static value Val_defbool(libxl_defbool c_val)
{
CAMLparam0();
- CAMLlocal1(v);
+ CAMLlocal2(v1, v2);
+ bool b;
if (libxl_defbool_is_default(c_val))
- v = Val_none;
+ v2 = Val_none;
else {
- bool b = libxl_defbool_val(c_val);
- v = Val_some(b ? Val_bool(true) : Val_bool(false));
+ b = libxl_defbool_val(c_val);
+ v1 = b ? Val_bool(true) : Val_bool(false);
+ v2 = Val_some(v1);
}
- CAMLreturn(v);
+ CAMLreturn(v2);
}
static libxl_defbool Defbool_val(value v)