pub unsafe extern "C" fn rb_thread_fd_select(
nfds: c_int,
rfds: *mut rb_fdset_t,
wfds: *mut rb_fdset_t,
efds: *mut rb_fdset_t,
timeout: *mut timeval,
) -> c_intExpand description
Waits for multiple file descriptors at once. This is basically a wrapper of system-provided select() with releasing GVL, to allow other Ruby threads run in parallel.
@param[in] nfds Max FD in everything passed, plus one.
@param[in,out] rfds Set of FDs to wait for reads.
@param[in,out] wfds Set of FDs to wait for writes.
@param[in,out] efds Set of FDs to wait for OOBs.
@param[in,out] timeout Max blocking duration.
@retval -1 Failed, errno set.
@retval 0 Timeout exceeded.
@retval otherwise Total number of file descriptors returned.
@post rfds contains readable FDs.
@post wfds contains writable FDs.
@post efds contains exceptional FDs.
@post timeout is the time left.
@note All pointers are allowed to be null pointers.
Although backend threads can run in parallel of this function, touching a file descriptor from multiple threads could be problematic. For instance what happens when a thread closes a file descriptor that is selected by someone else, vastly varies among operating systems. You would better avoid touching an fd from more than one threads.
@internal
ยงAlthough any file descriptors are possible here, it makes completely no
sense to pass a descriptor that is not O_NONBLOCK. If you want to know
the reason for this limitatuon in detail, you might find this thread super
interesting: https://lkml.org/lkml/2004/10/6/117
Generated by rb-sys for Ruby mri-x86_64-linux-gnu-3.2.3