diff --git a/lib/polly.ml b/lib/polly.ml index b96c5db..146ec4e 100644 --- a/lib/polly.ml +++ b/lib/polly.ml @@ -40,14 +40,19 @@ end type t = Unix.file_descr (* epoll fd *) -external caml_polly_add : t -> Unix.file_descr -> Events.t -> unit +external caml_raise_unix_error : string -> 'a = "caml_raise_unix_error" + +external caml_polly_add : t -> Unix.file_descr -> Events.t -> int = "caml_polly_add" +[@@noalloc] -external caml_polly_del : t -> Unix.file_descr -> Events.t -> unit +external caml_polly_del : t -> Unix.file_descr -> Events.t -> int = "caml_polly_del" +[@@noalloc] -external caml_polly_mod : t -> Unix.file_descr -> Events.t -> unit +external caml_polly_mod : t -> Unix.file_descr -> Events.t -> int = "caml_polly_mod" +[@@noalloc] external caml_polly_create1 : unit -> t = "caml_polly_create1" @@ -70,11 +75,17 @@ let create = caml_polly_create1 let close t = Unix.close t -let add = caml_polly_add +let add t fd e = + let r = caml_polly_add t fd e in + if r < 0 then caml_raise_unix_error "Polly.add" -let del t fd = caml_polly_del t fd Events.empty +let del t fd = + let r = caml_polly_del t fd Events.empty in + if r < 0 then caml_raise_unix_error "Polly.del" -let upd = caml_polly_mod +let upd t fd e = + let r = caml_polly_mod t fd e in + if r < 0 then caml_raise_unix_error "Polly.mod" let wait = caml_polly_wait diff --git a/lib/polly_stubs.c b/lib/polly_stubs.c index cb590bb..c953c19 100644 --- a/lib/polly_stubs.c +++ b/lib/polly_stubs.c @@ -35,19 +35,25 @@ CAMLprim value caml_polly_create1(value val_unit) CAMLreturn(val_res); } +/* beware, uerror is a macro in 5.0 and a function in 4.X, the new function + name is caml_uerror. uerror might be deprecated in the future. */ +CAMLprim void caml_raise_unix_error(value funname) { + CAMLparam1(funname); + uerror(String_val(funname),Nothing); +} + + static value caml_polly_ctl(value val_epfd, value val_fd, value val_events, int op) { - CAMLparam3(val_epfd, val_fd, val_events); - struct epoll_event event = { - .events = (uint32_t) Int_val(val_events), - .data.fd = Int_val(val_fd) - }; + CAMLparam3(val_epfd, val_fd, val_events); + struct epoll_event event = { + .events = (uint32_t) Int_val(val_events), + .data.fd = Int_val(val_fd) + }; - if (epoll_ctl(Int_val(val_epfd), op, Int_val(val_fd), &event) == -1) - uerror(__FUNCTION__, Nothing); - CAMLreturn(Val_unit); + CAMLreturn(Val_int(epoll_ctl(Int_val(val_epfd), op, Int_val(val_fd), &event))); } CAMLprim value caml_polly_add(value val_epfd, value val_fd, value val_events)