module Epoll:sig..end
    See the man pages for a full description of the epoll facility.
module Flags:sig..end
type 
Epoll.t maintains a map from File_descr.t to Flags.t, where the domain is
      the set of file descriptors that one is interested in, and the flags associated with
      each file descriptor specify the types of events one is interested in being notified
      about for that file descriptor.  Our implementation maintains a user-level table
      equivalent to the kernel epoll set, so that sexp_of_t produces useful
      human-readable information, and so that we can present our standard table
      interface.
      An Epoll.t also has a buffer that is used to store the set of ready fds returned
      by calling wait.
val invariant : t -> unitval create : (num_file_descrs:int -> max_ready_events:int -> t) Or_error.tcreate ~num_file_descrs creates a new epoll set able to watch file descriptors in
      [0, num_file_descrs).  Additionally, the set allocates space for reading the ready
      events when wait returns, allowing for up to max_ready_events to be returned in
      a single call to wait.val find : t -> Unix.File_descr.t -> Flags.t optionval find_exn : t -> Unix.File_descr.t -> Flags.tval set : t ->
       Unix.File_descr.t -> Flags.t -> unitval remove : t -> Unix.File_descr.t -> unitval iter : t ->
       f:(Unix.File_descr.t -> Flags.t -> unit) -> unitval wait : t ->
       timeout:[ `After of Span.t | `Immediately | `Never ] -> [ `Ok | `Timeout ]wait t ~timeout blocks until at least one file descriptor in t is ready for one
      of the events it is being watched for, or timeout passes.  wait side effects t
      by storing the ready set in it.  One can subsequently access the ready set by
      calling iter_ready or fold_ready.
      The timeout has a granularity of one millisecond.  wait rounds up the timeout
      to the next millisecond.  E.g. a timeout of one microsecond will be rounded up
      to one millisecond.
      Note that this method should not be considered thread safe.  There is mutable state
      in t that will be changed by invocations to wait that cannot be prevented by mutexes
      around wait.
val iter_ready : t ->
       f:(Unix.File_descr.t -> Flags.t -> unit) -> unititer_ready and fold_ready iterate over the ready set computed by the last
      call to wait.val fold_ready : t ->
       init:'a ->
       f:('a -> Unix.File_descr.t -> Flags.t -> 'a) -> 'aval sexp_of_t : t -> Sexplib.Sexp.tcreate ~num_file_descrs creates a new epoll set able to watch file descriptors in
      [0, num_file_descrs).  Additionally, the set allocates space for reading the ready
      events when wait returns, allowing for up to max_ready_events to be returned in
      a single call to wait.wait t ~timeout blocks until at least one file descriptor in t is ready for one
      of the events it is being watched for, or timeout passes.  wait side effects t
      by storing the ready set in it.  One can subsequently access the ready set by
      calling iter_ready or fold_ready.
      The timeout has a granularity of one millisecond.  wait rounds up the timeout
      to the next millisecond.  E.g. a timeout of one microsecond will be rounded up
      to one millisecond.
      Note that this method should not be considered thread safe.  There is mutable state
      in t that will be changed by invocations to wait that cannot be prevented by mutexes
      around wait.
iter_ready and fold_ready iterate over the ready set computed by the last
      call to wait.