Skip to content

Commit

Permalink
libxl: ocaml: make Val_defbool GC-proof
Browse files Browse the repository at this point in the history
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 <[email protected]>
Acked-by: David Scott <[email protected]>
Acked-by: Ian Campbell <[email protected]>
  • Loading branch information
robhoes authored and Ian Campbell committed Nov 11, 2013
1 parent 38d5aaf commit fe14c97
Showing 1 changed file with 7 additions and 5 deletions.
12 changes: 7 additions & 5 deletions tools/ocaml/libs/xl/xenlight_stubs.c
Original file line number Diff line number Diff line change
Expand Up @@ -308,15 +308,17 @@ static int Uuid_val(libxl_uuid *c_val, value v)
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)
Expand Down

0 comments on commit fe14c97

Please sign in to comment.