Ruby
3.4.0dev (2024-11-22 revision 0989400a925cd201defdca9eb28eb87200b30785)
|
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"
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... | |
Public APIs to provide rb_fd_select().
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. __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. Definition in file select.h.
#define rb_fd_resize | ( | n, | |
f | |||
) | ((void)(f)) |
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.
[in] | nfds | Max FD in everything passed, plus one. |
[in,out] | rfds | Set of FDs to wait for reads. |
[in,out] | wfds | Set of FDs to wait for writes. |
[in,out] | efds | Set of FDs to wait for OOBs. |
[in,out] | timeout | Max blocking duration. |
-1 | Failed, errno set. |
0 | Timeout exceeded. |
otherwise | Total number of file descriptors returned. |
rfds
contains readable FDs. wfds
contains writable FDs. efds
contains exceptional FDs. timeout
is the time left. 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.