Ruby  3.4.0dev (2024-12-06 revision 892c46283a5ea4179500d951c9d4866c0051f27b)
Macros | Functions
select.h File Reference

(892c46283a5ea4179500d951c9d4866c0051f27b)

Public APIs to provide rb_fd_select(). More...

#include "ruby/internal/config.h"
#include "ruby/internal/dllexport.h"
#include "ruby/internal/intern/select/posix.h"
Include dependency graph for select.h:
This graph shows which files directly or indirectly include this file:

Go to the source code of this file.

Macros

#define rb_fd_resize(n, f)   ((void)(f))
 Does nothing (defined for compatibility). More...
 

Functions

int rb_thread_fd_select (int nfds, rb_fdset_t *rfds, rb_fdset_t *wfds, rb_fdset_t *efds, struct timeval *timeout)
 Waits for multiple file descriptors at once. More...
 

Detailed Description

Public APIs to provide rb_fd_select().

Author
Ruby developers ruby-.nosp@m.core.nosp@m.@ruby.nosp@m.-lan.nosp@m.g.org
Warning
Symbols prefixed with either RBIMPL or rbimpl are implementation details. Don't take them as canon. They could rapidly appear then vanish. The name (path) of this header file is also an implementation detail. Do not expect it to persist at the place it is now. Developers are free to move it anywhere anytime at will.
Note
To ruby-core: remember that this header can be possibly recursively included from extension libraries written in C++. Do not expect for instance __VA_ARGS__ is always available. We assume C99 for ruby itself but we don't assume languages of extension libraries. They could be written in C++98.
Functions and structs defined in this header file are not necessarily ruby-specific. They don't need VALUE etc.

Definition in file select.h.

Macro Definition Documentation

◆ rb_fd_resize

#define rb_fd_resize (   n,
 
)    ((void)(f))

Does nothing (defined for compatibility).

Definition at line 43 of file select.h.

Function Documentation

◆ rb_thread_fd_select()

int rb_thread_fd_select ( int  nfds,
rb_fdset_t rfds,
rb_fdset_t wfds,
rb_fdset_t efds,
struct timeval timeout 
)

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.

Parameters
[in]nfdsMax FD in everything passed, plus one.
[in,out]rfdsSet of FDs to wait for reads.
[in,out]wfdsSet of FDs to wait for writes.
[in,out]efdsSet of FDs to wait for OOBs.
[in,out]timeoutMax blocking duration.
Return values
-1Failed, errno set.
0Timeout exceeded.
otherwiseTotal number of file descriptors returned.
Postcondition
rfds contains readable FDs.
wfds contains writable FDs.
efds contains exceptional FDs.
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.

Definition at line 4333 of file thread.c.