comparison third_party/libuv/docs/src/handle.rst @ 160:948de3f54cea

[ThirdParty] Added libuv
author June Park <parkjune1995@gmail.com>
date Wed, 14 Jan 2026 19:39:52 -0800
parents
children
comparison
equal deleted inserted replaced
159:05cf9467a1c3 160:948de3f54cea
1
2 .. _handle:
3
4 :c:type:`uv_handle_t` --- Base handle
5 =====================================
6
7 `uv_handle_t` is the base type for all libuv handle types.
8
9 Structures are aligned so that any libuv handle can be cast to `uv_handle_t`.
10 All API functions defined here work with any handle type.
11
12 Libuv handles are not movable. Pointers to handle structures passed to
13 functions must remain valid for the duration of the requested operation. Take
14 care when using stack allocated handles.
15
16 Data types
17 ----------
18
19 .. c:type:: uv_handle_t
20
21 The base libuv handle type.
22
23 .. c:enum:: uv_handle_type
24
25 The kind of the libuv handle.
26
27 ::
28
29 typedef enum {
30 UV_UNKNOWN_HANDLE = 0,
31 UV_ASYNC,
32 UV_CHECK,
33 UV_FS_EVENT,
34 UV_FS_POLL,
35 UV_HANDLE,
36 UV_IDLE,
37 UV_NAMED_PIPE,
38 UV_POLL,
39 UV_PREPARE,
40 UV_PROCESS,
41 UV_STREAM,
42 UV_TCP,
43 UV_TIMER,
44 UV_TTY,
45 UV_UDP,
46 UV_SIGNAL,
47 UV_FILE,
48 UV_HANDLE_TYPE_MAX
49 } uv_handle_type;
50
51 .. c:type:: uv_any_handle
52
53 Union of all handle types.
54
55 .. c:type:: void (*uv_alloc_cb)(uv_handle_t* handle, size_t suggested_size, uv_buf_t* buf)
56
57 Type definition for callback passed to :c:func:`uv_read_start` and
58 :c:func:`uv_udp_recv_start`. The user must allocate memory and fill the supplied
59 :c:type:`uv_buf_t` structure. If NULL is assigned as the buffer's base or 0 as its length,
60 a ``UV_ENOBUFS`` error will be triggered in the :c:type:`uv_udp_recv_cb` or the
61 :c:type:`uv_read_cb` callback.
62
63 Each buffer is used only once and the user is responsible for freeing it in the
64 :c:type:`uv_udp_recv_cb` or the :c:type:`uv_read_cb` callback.
65
66 A suggested size (65536 at the moment in most cases) is provided, but it's just an indication,
67 not related in any way to the pending data to be read. The user is free to allocate the amount
68 of memory they decide.
69
70 As an example, applications with custom allocation schemes such as using freelists, allocation
71 pools or slab based allocators may decide to use a different size which matches the memory
72 chunks they already have.
73
74 Example:
75
76 ::
77
78 static void my_alloc_cb(uv_handle_t* handle, size_t suggested_size, uv_buf_t* buf) {
79 buf->base = malloc(suggested_size);
80 buf->len = suggested_size;
81 }
82
83 .. c:type:: void (*uv_close_cb)(uv_handle_t* handle)
84
85 Type definition for callback passed to :c:func:`uv_close`.
86
87
88 Public members
89 ^^^^^^^^^^^^^^
90
91 .. c:member:: uv_loop_t* uv_handle_t.loop
92
93 Pointer to the :c:type:`uv_loop_t` the handle is running on. Readonly.
94
95 .. c:member:: uv_handle_type uv_handle_t.type
96
97 The :c:enum:`uv_handle_type`, indicating the type of the underlying handle. Readonly.
98
99 .. c:member:: void* uv_handle_t.data
100
101 Space for user-defined arbitrary data. libuv does not use this field.
102
103
104 API
105 ---
106
107 .. c:macro:: UV_HANDLE_TYPE_MAP(iter_macro)
108
109 Macro that expands to a series of invocations of `iter_macro` for
110 each of the handle types. `iter_macro` is invoked with two
111 arguments: the name of the `uv_handle_type` element without the
112 `UV_` prefix, and the name of the corresponding structure type
113 without the `uv_` prefix and `_t` suffix.
114
115 .. c:function:: int uv_is_active(const uv_handle_t* handle)
116
117 Returns non-zero if the handle is active, zero if it's inactive. What
118 "active" means depends on the type of handle:
119
120 - A uv_async_t handle is always active and cannot be deactivated, except
121 by closing it with uv_close().
122
123 - A uv_pipe_t, uv_tcp_t, uv_udp_t, etc. handle - basically any handle that
124 deals with i/o - is active when it is doing something that involves i/o,
125 like reading, writing, connecting, accepting new connections, etc.
126
127 - A uv_check_t, uv_idle_t, uv_timer_t, etc. handle is active when it has
128 been started with a call to uv_check_start(), uv_idle_start(), etc.
129
130 Rule of thumb: if a handle of type `uv_foo_t` has a `uv_foo_start()`
131 function, then it's active from the moment that function is called.
132 Likewise, `uv_foo_stop()` deactivates the handle again.
133
134 .. c:function:: int uv_is_closing(const uv_handle_t* handle)
135
136 Returns non-zero if the handle is closing or closed, zero otherwise.
137
138 .. note::
139 This function should only be used between the initialization of the handle and the
140 arrival of the close callback.
141
142 .. c:function:: void uv_close(uv_handle_t* handle, uv_close_cb close_cb)
143
144 Request handle to be closed. `close_cb` will be called asynchronously after
145 this call. This MUST be called on each handle before memory is released.
146 Moreover, the memory can only be released in `close_cb` or after it has
147 returned.
148
149 Handles that wrap file descriptors are closed immediately but
150 `close_cb` will still be deferred to the next iteration of the event loop.
151 It gives you a chance to free up any resources associated with the handle.
152
153 In-progress requests, like uv_connect_t or uv_write_t, are cancelled and
154 have their callbacks called asynchronously with status=UV_ECANCELED.
155
156 `close_cb` can be `NULL` in cases where no cleanup or deallocation is
157 necessary.
158
159 .. c:function:: void uv_ref(uv_handle_t* handle)
160
161 Reference the given handle. References are idempotent, that is, if a handle
162 is already referenced calling this function again will have no effect.
163
164 See :ref:`refcount`.
165
166 .. c:function:: void uv_unref(uv_handle_t* handle)
167
168 Un-reference the given handle. References are idempotent, that is, if a handle
169 is not referenced calling this function again will have no effect.
170
171 See :ref:`refcount`.
172
173 .. c:function:: int uv_has_ref(const uv_handle_t* handle)
174
175 Returns non-zero if the handle referenced, zero otherwise.
176
177 See :ref:`refcount`.
178
179 .. c:function:: size_t uv_handle_size(uv_handle_type type)
180
181 Returns the size of the given handle type. Useful for FFI binding writers
182 who don't want to know the structure layout.
183
184
185 Miscellaneous API functions
186 ---------------------------
187
188 The following API functions take a :c:type:`uv_handle_t` argument but they work
189 just for some handle types.
190
191 .. c:function:: int uv_send_buffer_size(uv_handle_t* handle, int* value)
192
193 Gets or sets the size of the send buffer that the operating
194 system uses for the socket.
195
196 If `*value` == 0, then it will set `*value` to the current send buffer size.
197 If `*value` > 0 then it will use `*value` to set the new send buffer size.
198
199 On success, zero is returned. On error, a negative result is
200 returned.
201
202 This function works for TCP, pipe and UDP handles on Unix and for TCP and
203 UDP handles on Windows.
204
205 .. note::
206 Linux will set double the size and return double the size of the original set value.
207
208 .. c:function:: int uv_recv_buffer_size(uv_handle_t* handle, int* value)
209
210 Gets or sets the size of the receive buffer that the operating
211 system uses for the socket.
212
213 If `*value` == 0, then it will set `*value` to the current receive buffer size.
214 If `*value` > 0 then it will use `*value` to set the new receive buffer size.
215
216 On success, zero is returned. On error, a negative result is
217 returned.
218
219 This function works for TCP, pipe and UDP handles on Unix and for TCP and
220 UDP handles on Windows.
221
222 .. note::
223 Linux will set double the size and return double the size of the original set value.
224
225 .. c:function:: int uv_fileno(const uv_handle_t* handle, uv_os_fd_t* fd)
226
227 Gets the platform dependent file descriptor equivalent.
228
229 The following handles are supported: TCP, pipes, TTY, UDP and poll. Passing
230 any other handle type will fail with `UV_EINVAL`.
231
232 If a handle doesn't have an attached file descriptor yet or the handle
233 itself has been closed, this function will return `UV_EBADF`.
234
235 .. warning::
236 Be very careful when using this function. libuv assumes it's in control of the file
237 descriptor so any change to it may lead to malfunction.
238
239 .. c:function:: uv_loop_t* uv_handle_get_loop(const uv_handle_t* handle)
240
241 Returns `handle->loop`.
242
243 .. versionadded:: 1.19.0
244
245 .. c:function:: void* uv_handle_get_data(const uv_handle_t* handle)
246
247 Returns `handle->data`.
248
249 .. versionadded:: 1.19.0
250
251 .. c:function:: void uv_handle_set_data(uv_handle_t* handle, void* data)
252
253 Sets `handle->data` to `data`.
254
255 .. versionadded:: 1.19.0
256
257 .. c:function:: uv_handle_type uv_handle_get_type(const uv_handle_t* handle)
258
259 Returns `handle->type`.
260
261 .. versionadded:: 1.19.0
262
263 .. c:function:: const char* uv_handle_type_name(uv_handle_type type)
264
265 Returns the name for the equivalent struct for a given handle type,
266 e.g. `"pipe"` (as in :c:type:`uv_pipe_t`) for `UV_NAMED_PIPE`.
267
268 If no such handle type exists, this returns `NULL`.
269
270 .. versionadded:: 1.19.0
271
272 .. _refcount:
273
274 Reference counting
275 ------------------
276
277 The libuv event loop (if run in the default mode) will run until there are no
278 active `and` referenced handles left. The user can force the loop to exit early
279 by unreferencing handles which are active, for example by calling :c:func:`uv_unref`
280 after calling :c:func:`uv_timer_start`.
281
282 A handle can be referenced or unreferenced, the refcounting scheme doesn't use
283 a counter, so both operations are idempotent.
284
285 All handles are referenced when active by default, see :c:func:`uv_is_active`
286 for a more detailed explanation on what being `active` involves.