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 9Structures are aligned so that any libuv handle can be cast to `uv_handle_t`. 10All API functions defined here work with any handle type. 11 12Libuv handles are not movable. Pointers to handle structures passed to 13functions must remain valid for the duration of the requested operation. Take 14care when using stack allocated handles. 15 16Data 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 88Public 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 104API 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 185Miscellaneous API functions 186--------------------------- 187 188The following API functions take a :c:type:`uv_handle_t` argument but they work 189just 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 274Reference counting 275------------------ 276 277The libuv event loop (if run in the default mode) will run until there are no 278active `and` referenced handles left. The user can force the loop to exit early 279by unreferencing handles which are active, for example by calling :c:func:`uv_unref` 280after calling :c:func:`uv_timer_start`. 281 282A handle can be referenced or unreferenced, the refcounting scheme doesn't use 283a counter, so both operations are idempotent. 284 285All handles are referenced when active by default, see :c:func:`uv_is_active` 286for a more detailed explanation on what being `active` involves. 287