libxl: ocaml: make Val_defbool GC-proof
authorRob Hoes <rob.hoes@citrix.com>
Wed, 6 Nov 2013 17:49:50 +0000 (17:49 +0000)
committerIan Campbell <ian.campbell@citrix.com>
Mon, 11 Nov 2013 15:39:39 +0000 (15:39 +0000)
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>
tools/ocaml/libs/xl/xenlight_stubs.c

index 67612f486f08025ec30392d02cc61cb2b9b671aa..94601c47993623d90d3b8ebcfe5d3b87cd3cee54 100644 (file)
@@ -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)