tools/ocaml/evtchn: Extend the init() binding with a cloexec flag

For live update, oxenstored wants to clear CLOEXEC on the evtchn handle, so it
survives the execve() into the new oxenstored.

Have the new interface match how cloexec works in other Ocaml standard
libraries.

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>
(cherry picked from commit 9bafe4a533)
This commit is contained in:
Edwin Török authored and Andrew Cooper committed 2022-12-12 11:04:12 +00:00
1 parent dd3006b1dd
commit c96f51bc3e
3 files changed
+17 -7

No files matched your search

+4 -1
View File
@@ -16,7 +16,10 @@
type handle
external init: unit -> handle = "stub_eventchn_init"
external _init: bool -> handle = "stub_eventchn_init"
let init ?(cloexec=true) () = _init cloexec
external fdopen: Unix.file_descr -> handle = "stub_eventchn_fdopen"
external fd: handle -> Unix.file_descr = "stub_eventchn_fd"
+6 -3
View File
@@ -43,9 +43,12 @@ val to_int: t -> int
val of_int: int -> t
val init: unit -> handle
(** Return an initialised event channel interface. On error it
will throw a Failure exception. *)
val init: ?cloexec:bool -> unit -> handle
(** [init ?cloexec ()]
Return an initialised event channel interface.
The default is to close the underlying file descriptor
on [execve], which can be overriden with [~cloexec:false].
On error it will throw a Failure exception. *)
val fdopen: Unix.file_descr -> handle
(** Return an initialised event channel interface, from an already open evtchn
@@ -50,14 +50,18 @@ static struct custom_operations xenevtchn_ops = {
.compare_ext = custom_compare_ext_default, /* Can't compare */
};
CAMLprim value stub_eventchn_init(void)
CAMLprim value stub_eventchn_init(value cloexec)
{
CAMLparam0();
CAMLparam1(cloexec);
CAMLlocal1(result);
xenevtchn_handle *xce;
unsigned int flags = 0;
if ( !Bool_val(cloexec) )
flags |= XENEVTCHN_NO_CLOEXEC;
caml_enter_blocking_section();
xce = xenevtchn_open(NULL, 0);
xce = xenevtchn_open(NULL, flags);
caml_leave_blocking_section();
if (xce == NULL)
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.