mirror of
https://github.com/xen-project/xen.git
synced 2026-10-29 18:50:05 +01:00
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:
1 parent
ee36179371
commit
22d5affdf0
1 file changed
+19
-2
@@ -33,7 +33,22 @@
|
|||||||
#include <caml/fail.h>
|
#include <caml/fail.h>
|
||||||
#include <caml/signals.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)
|
CAMLprim value stub_eventchn_init(void)
|
||||||
{
|
{
|
||||||
@@ -48,7 +63,9 @@ CAMLprim value stub_eventchn_init(void)
|
|||||||
if (xce == NULL)
|
if (xce == NULL)
|
||||||
caml_failwith("open failed");
|
caml_failwith("open failed");
|
||||||
|
|
||||||
result = (value)xce;
|
result = caml_alloc_custom(&xenevtchn_ops, sizeof(xce), 0, 1);
|
||||||
|
_H(result) = xce;
|
||||||
|
|
||||||
CAMLreturn(result);
|
CAMLreturn(result);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||