tools/ocaml/evtchn: OCaml 5 support, fix potential resource leak

There is no binding for xenevtchn_close().  In principle, this is a resource
leak, but the typical usage is as a singleton that lives for the lifetime of
the program.

Ocaml 5 no longer permits storing a naked C pointer in an Ocaml value.

Therefore, use a Custom block.  This allows us to use the finaliser callback
to call xenevtchn_close(), if the Ocaml object goes out of scope.

Signed-off-by: Edwin Török <edvin.torok@citrix.com>
Signed-off-by: Andrew Cooper <andrew.cooper3@citrix.com>
Acked-by: Christian Lindig <christian.lindig@citrix.com>
This commit is contained in:
Edwin Török authored and Andrew Cooper committed 2022-12-01 16:07:17 +00:00
1 parent ee36179371
commit 22d5affdf0
1 file changed
+19 -2
+19 -2
View File
@@ -33,7 +33,22 @@
#include <caml/fail.h>
#include <caml/signals.h>
#define _H(__h) ((xenevtchn_handle *)(__h))
#define _H(__h) (*((xenevtchn_handle **)Data_custom_val(__h)))
static void stub_evtchn_finalize(value v)
{
xenevtchn_close(_H(v));
}
static struct custom_operations xenevtchn_ops = {
.identifier = "xenevtchn",
.finalize = stub_evtchn_finalize,
.compare = custom_compare_default, /* Can't compare */
.hash = custom_hash_default, /* Can't hash */
.serialize = custom_serialize_default, /* Can't serialize */
.deserialize = custom_deserialize_default, /* Can't deserialize */
.compare_ext = custom_compare_ext_default, /* Can't compare */
};
CAMLprim value stub_eventchn_init(void)
{
@@ -48,7 +63,9 @@ CAMLprim value stub_eventchn_init(void)
if (xce == NULL)
caml_failwith("open failed");
result = (value)xce;
result = caml_alloc_custom(&xenevtchn_ops, sizeof(xce), 0, 1);
_H(result) = xce;
CAMLreturn(result);
}
Reference in new issue
Block a user
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.