Function rb_thread_fd_select

Source
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_int
Expand 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