Ruby: include/ruby/internal/intern/select.h File Reference

Ruby 3.2.5p208 (2024-07-26 revision 31d0f1a2e7dbfb60731d1f05b868e1d578cda493)

Macros | Functions
select.h File Reference

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)
| Does nothing (defined for compatibility).

## 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.

## 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

Copyright
  This file is a part of the programming language Ruby. Permission is hereby granted, to either redistribute and/or modify this file, provided that the conditions mentioned in the file COPYING are met. Consult the file for details.

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,
|  |  | f )

Value:
((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] | 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.

Return values

  -1 | Failed, errno set.
  0 | Timeout exceeded.
  otherwise | Total 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 4201 of file thread.c.

Referenced by rb_thread_fd_select().