module type File_descr_watcher = File_descr_watcher_intf.S
type
t
A file-descr-watcher is essentially a map from File_descr.t
to bool
Read_write.t
, which defines the set of file descriptors being watched, and for each
file descriptor, whether it is being watched for read, write, or both. If a file
descriptor is not being watched for neither, it is not in the map.
include Invariant.S
val create : num_file_descrs:int -> t
create ~num_file_descrs
creates a new file-descr-watcher that is able to watch
file descriptors in
[0, num_file_descrs)
.
val set : t ->
Import.File_descr.t -> bool Read_write.t -> unit
set
alters the map of file descriptors being watched. It will take effect on the
next call to thread_safe_check
. Calling set fd
with { read = false, write =
false }
removes fd
from the map.
val iter : t ->
f:(Import.File_descr.t -> Read_write.Key.t -> unit) -> unit
iter t ~f
iterates over every file descriptor in the map, apply f
to it once
for each of {`Read,`Write} that it is being watched for.
module Pre: sig
.. end
pre_check t
does whatever non-thread-safe work is necessary to prepare for the
system call that checks file descriptors being ready for read or write.
val pre_check : t -> Pre.t
module Check_result: sig
.. end
thread_safe_check t pre ~timeout
checks the file descriptors for their status and
returns when at least one is available, or the timeout
passes.
val thread_safe_check : t ->
Pre.t ->
timeout:File_descr_watcher_intf.Timeout.t ->
Check_result.t
val post_check : t ->
Check_result.t ->
[ `Ok of File_descr_watcher_intf.Post.t Read_write.t
| `Syscall_interrupted
| `Timeout ]
post_check t check_result
returns the file descriptors available for read and
write. Any file descriptor appearing in post
for read must have been watched
for read, as per set
. Similarly for write.
val sexp_of_t : t -> Sexplib.Sexp.t
create ~num_file_descrs
creates a new file-descr-watcher that is able to watch
file descriptors in [0, num_file_descrs)
.
set
alters the map of file descriptors being watched. It will take effect on the
next call to thread_safe_check
. Calling set fd
with { read = false, write =
false }
removes fd
from the map.
iter t ~f
iterates over every file descriptor in the map, apply f
to it once
for each of {`Read,`Write} that it is being watched for.
pre_check t
does whatever non-thread-safe work is necessary to prepare for the
system call that checks file descriptors being ready for read or write. pre_check
does not side effect t
.
thread_safe_check t pre ~timeout
checks the file descriptors for their status and
returns when at least one is available, or the timeout
passes.
thread_safe_check
does not side effect t
. Unlike the rest of the functions in
this module, thread_safe_check
is thread safe.
post_check t check_result
returns the file descriptors available for read and
write. Any file descriptor appearing in post
for read must have been watched
for read, as per set
. Similarly for write.