blob: 5f828e66e2cf1400fa5e48b7221a599b8c2e2605 (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
|
#ifndef RBIMPL_INTERN_SELECT_POSIX_H /*-*-C++-*-vi:se ft=cpp:*/
#define RBIMPL_INTERN_SELECT_POSIX_H
/**
* @file
* @author Ruby developers <ruby-core@ruby-lang.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.
* @brief Public APIs to provide ::rb_fd_select().
*/
#include "ruby/internal/config.h"
#ifdef HAVE_SYS_SELECT_H
# include <sys/select.h> /* for select(2) (modern POSIX) */
#endif
#ifdef HAVE_UNISTD_H
# include <unistd.h> /* for select(2) (archaic UNIX) */
#endif
#include "ruby/internal/attr/const.h"
#include "ruby/internal/attr/noalias.h"
#include "ruby/internal/attr/nonnull.h"
#include "ruby/internal/attr/pure.h"
/**
* The data structure which wraps the fd_set bitmap used by `select(2)`. This
* allows Ruby to use FD sets larger than what has been historically allowed on
* modern platforms.
*
* @internal
*
* ... but because this header file is included only when the system is with
* that "historic restrictions", this is nothing more than an alias of fd_set.
*/
typedef fd_set rb_fdset_t;
/** Clears the given ::rb_fdset_t. */
#define rb_fd_zero FD_ZERO
/** Sets the given fd to the ::rb_fdset_t. */
#define rb_fd_set FD_SET
/** Unsets the given fd from the ::rb_fdset_t. */
#define rb_fd_clr FD_CLR
/** Queries if the given fd is in the ::rb_fdset_t. */
#define rb_fd_isset FD_ISSET
/** Initialises the :given :rb_fdset_t. */
#define rb_fd_init FD_ZERO
/** Waits for multiple file descriptors at once. */
#define rb_fd_select select
/**@cond INTERNAL_MACRO */
#define rb_fd_copy rb_fd_copy
#define rb_fd_dup rb_fd_dup
#define rb_fd_ptr rb_fd_ptr
#define rb_fd_max rb_fd_max
/** @endcond */
RBIMPL_ATTR_NONNULL(())
RBIMPL_ATTR_NOALIAS()
/**
* Destructively overwrites an fdset with another.
*
* @param[out] dst Target fdset.
* @param[in] src Source fdset.
* @param[in] n Unused parameter.
* @post `dst` is a copy of `src`.
*/
static inline void
rb_fd_copy(rb_fdset_t *dst, const fd_set *src, int n)
{
*dst = *src;
}
RBIMPL_ATTR_NONNULL(())
RBIMPL_ATTR_NOALIAS()
/**
* Destructively overwrites an fdset with another.
*
* @param[out] dst Target fdset.
* @param[in] src Source fdset.
* @post `dst` is a copy of `src`.
*/
static inline void
rb_fd_dup(rb_fdset_t *dst, const fd_set *src)
{
*dst = *src;
}
RBIMPL_ATTR_PURE()
/* :TODO: can this function be __attribute__((returns_nonnull)) or not? */
/**
* Raw pointer to `fd_set`.
*
* @param[in] f Target fdset.
* @return Underlying fd_set.
*
* @internal
*
* Extension library must not touch raw pointers. It was a bad idea to let
* them use it.
*/
static inline fd_set *
rb_fd_ptr(rb_fdset_t *f)
{
return f;
}
RBIMPL_ATTR_CONST()
/**
* It seems this function has no use. Maybe just remove?
*
* @param[in] f A set.
* @return Number of file descriptors stored.
*/
static inline int
rb_fd_max(const rb_fdset_t *f)
{
return FD_SETSIZE;
}
/** @cond INTERNAL_MACRO */
/* :FIXME: What are these? They don't exist for shibling implementations. */
#define rb_fd_init_copy(d, s) (*(d) = *(s))
#define rb_fd_term(f) ((void)(f))
/** @endcond */
#endif /* RBIMPL_INTERN_SELECT_POSIX_H */
|