1[/ 2 / Copyright (c) 2003-2021 Christopher M. Kohlhoff (chris at kohlhoff dot com) 3 / 4 / Distributed under the Boost Software License, Version 1.0. (See accompanying 5 / file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) 6 /] 7 8[section:implementation Platform-Specific Implementation Notes] 9 10This section lists platform-specific implementation details, such as the 11default demultiplexing mechanism, the number of threads created internally, and 12when threads are created. 13 14 15[heading Linux Kernel 2.4] 16 17Demultiplexing mechanism: 18 19* Uses `select` for demultiplexing. This means that the number of file 20descriptors in the process cannot be permitted to exceed `FD_SETSIZE`. 21 22Threads: 23 24* Demultiplexing using `select` is performed in one of the threads that calls 25`io_context::run()`, `io_context::run_one()`, `io_context::poll()` or 26`io_context::poll_one()`. 27 28* An additional thread per `io_context` is used to emulate asynchronous host 29resolution. This thread is created on the first call to either 30`ip::tcp::resolver::async_resolve()` or `ip::udp::resolver::async_resolve()`. 31 32Scatter-Gather: 33 34* At most `min(64,IOV_MAX)` buffers may be transferred in a single operation. 35 36[heading Linux Kernel 2.6] 37 38Demultiplexing mechanism: 39 40* Uses `epoll` for demultiplexing. 41 42Threads: 43 44* Demultiplexing using `epoll` is performed in one of the threads that calls 45`io_context::run()`, `io_context::run_one()`, `io_context::poll()` or 46`io_context::poll_one()`. 47 48* An additional thread per `io_context` is used to emulate asynchronous host 49resolution. This thread is created on the first call to either 50`ip::tcp::resolver::async_resolve()` or `ip::udp::resolver::async_resolve()`. 51 52Scatter-Gather: 53 54* At most `min(64,IOV_MAX)` buffers may be transferred in a single operation. 55 56 57[heading Solaris] 58 59Demultiplexing mechanism: 60 61* Uses [^/dev/poll] for demultiplexing. 62 63Threads: 64 65* Demultiplexing using [^/dev/poll] is performed in one of the threads that 66calls `io_context::run()`, `io_context::run_one()`, `io_context::poll()` or 67`io_context::poll_one()`. 68 69* An additional thread per `io_context` is used to emulate asynchronous host 70resolution. This thread is created on the first call to either 71`ip::tcp::resolver::async_resolve()` or `ip::udp::resolver::async_resolve()`. 72 73Scatter-Gather: 74 75* At most `min(64,IOV_MAX)` buffers may be transferred in a single operation. 76 77 78[heading QNX Neutrino] 79 80Demultiplexing mechanism: 81 82* Uses `select` for demultiplexing. This means that the number of file 83descriptors in the process cannot be permitted to exceed `FD_SETSIZE`. 84 85Threads: 86 87* Demultiplexing using `select` is performed in one of the threads that calls 88`io_context::run()`, `io_context::run_one()`, `io_context::poll()` or 89`io_context::poll_one()`. 90 91* An additional thread per `io_context` is used to emulate asynchronous host 92resolution. This thread is created on the first call to either 93`ip::tcp::resolver::async_resolve()` or `ip::udp::resolver::async_resolve()`. 94 95Scatter-Gather: 96 97* At most `min(64,IOV_MAX)` buffers may be transferred in a single operation. 98 99 100[heading Mac OS X] 101 102Demultiplexing mechanism: 103 104* Uses `kqueue` for demultiplexing. 105 106Threads: 107 108* Demultiplexing using `kqueue` is performed in one of the threads that calls 109`io_context::run()`, `io_context::run_one()`, `io_context::poll()` or 110`io_context::poll_one()`. 111 112* An additional thread per `io_context` is used to emulate asynchronous host 113resolution. This thread is created on the first call to either 114`ip::tcp::resolver::async_resolve()` or `ip::udp::resolver::async_resolve()`. 115 116Scatter-Gather: 117 118* At most `min(64,IOV_MAX)` buffers may be transferred in a single operation. 119 120 121[heading FreeBSD] 122 123Demultiplexing mechanism: 124 125* Uses `kqueue` for demultiplexing. 126 127Threads: 128 129* Demultiplexing using `kqueue` is performed in one of the threads that calls 130`io_context::run()`, `io_context::run_one()`, `io_context::poll()` or 131`io_context::poll_one()`. 132 133* An additional thread per `io_context` is used to emulate asynchronous host 134resolution. This thread is created on the first call to either 135`ip::tcp::resolver::async_resolve()` or `ip::udp::resolver::async_resolve()`. 136 137Scatter-Gather: 138 139* At most `min(64,IOV_MAX)` buffers may be transferred in a single operation. 140 141 142[heading AIX] 143 144Demultiplexing mechanism: 145 146* Uses `select` for demultiplexing. This means that the number of file 147descriptors in the process cannot be permitted to exceed `FD_SETSIZE`. 148 149Threads: 150 151* Demultiplexing using `select` is performed in one of the threads that calls 152`io_context::run()`, `io_context::run_one()`, `io_context::poll()` or 153`io_context::poll_one()`. 154 155* An additional thread per `io_context` is used to emulate asynchronous host 156resolution. This thread is created on the first call to either 157`ip::tcp::resolver::async_resolve()` or `ip::udp::resolver::async_resolve()`. 158 159Scatter-Gather: 160 161* At most `min(64,IOV_MAX)` buffers may be transferred in a single operation. 162 163 164[heading HP-UX] 165 166Demultiplexing mechanism: 167 168* Uses `select` for demultiplexing. This means that the number of file 169descriptors in the process cannot be permitted to exceed `FD_SETSIZE`. 170 171Threads: 172 173* Demultiplexing using `select` is performed in one of the threads that calls 174`io_context::run()`, `io_context::run_one()`, `io_context::poll()` or 175`io_context::poll_one()`. 176 177* An additional thread per `io_context` is used to emulate asynchronous host 178resolution. This thread is created on the first call to either 179`ip::tcp::resolver::async_resolve()` or `ip::udp::resolver::async_resolve()`. 180 181Scatter-Gather: 182 183* At most `min(64,IOV_MAX)` buffers may be transferred in a single operation. 184 185 186[heading Tru64] 187 188Demultiplexing mechanism: 189 190* Uses `select` for demultiplexing. This means that the number of file 191descriptors in the process cannot be permitted to exceed `FD_SETSIZE`. 192 193Threads: 194 195* Demultiplexing using `select` is performed in one of the threads that calls 196`io_context::run()`, `io_context::run_one()`, `io_context::poll()` or 197`io_context::poll_one()`. 198 199* An additional thread per `io_context` is used to emulate asynchronous host 200resolution. This thread is created on the first call to either 201`ip::tcp::resolver::async_resolve()` or `ip::udp::resolver::async_resolve()`. 202 203Scatter-Gather: 204 205* At most `min(64,IOV_MAX)` buffers may be transferred in a single operation. 206 207 208[heading Windows 95, 98 and Me] 209 210Demultiplexing mechanism: 211 212* Uses `select` for demultiplexing. 213 214Threads: 215 216* Demultiplexing using `select` is performed in one of the threads that calls 217`io_context::run()`, `io_context::run_one()`, `io_context::poll()` or 218`io_context::poll_one()`. 219 220* An additional thread per `io_context` is used to emulate asynchronous host 221resolution. This thread is created on the first call to either 222`ip::tcp::resolver::async_resolve()` or `ip::udp::resolver::async_resolve()`. 223 224Scatter-Gather: 225 226* For sockets, at most 16 buffers may be transferred in a single operation. 227 228 229[heading Windows NT, 2000, XP, 2003, Vista, 7 and 8] 230 231Demultiplexing mechanism: 232 233* Uses overlapped I/O and I/O completion ports for all asynchronous socket 234operations except for asynchronous connect. 235 236* Uses `select` for emulating asynchronous connect. 237 238Threads: 239 240* Demultiplexing using I/O completion ports is performed in all threads that call 241`io_context::run()`, `io_context::run_one()`, `io_context::poll()` or 242`io_context::poll_one()`. 243 244* An additional thread per `io_context` is used to trigger timers. This thread 245is created on construction of the first `basic_deadline_timer` or 246`basic_waitable_timer` objects. 247 248* An additional thread per `io_context` may be used for `select` 249 demultiplexing. This thread is created on the first call to: 250 251 * A socket `async_wait()` function, except when using `wait_read` on 252 a stream-oriented socket. (For `wait_read` on a stream-oriented socket, 253 the overlapped I/O operation `WSARecv` is used and no additional thread 254 is required.) 255 256 * A socket `async_connect()` operation, if the overlapped I/O 257 operation `ConnectEx` is unavailable. (On recent versions of Windows, 258 `ConnectEx` is used and no additional thread is required.) 259 260* An additional thread per `io_context` is used to emulate asynchronous host 261resolution. This thread is created on the first call to either 262`ip::tcp::resolver::async_resolve()` or `ip::udp::resolver::async_resolve()`. 263 264Scatter-Gather: 265 266* For sockets, at most 64 buffers may be transferred in a single operation. 267 268* For stream-oriented handles, only one buffer may be transferred in a single 269operation. 270 271[heading Windows Runtime] 272 273Boost.Asio provides limited support for the Windows Runtime. It requires that the 274language extensions be enabled. Due to the restricted facilities exposed by the 275Windows Runtime API, the support comes with the following caveats: 276 277* The core facilities such as the `io_context`, `strand`, buffers, composed 278 operations, timers, etc., should all work as normal. 279 280* For sockets, only client-side TCP is supported. 281 282* Explicit binding of a client-side TCP socket is not supported. 283 284* The `cancel()` function is not supported for sockets. Asynchronous 285 operations may only be cancelled by closing the socket. 286 287* Operations that use `null_buffers` are not supported. 288 289* Only `tcp::no_delay` and `socket_base::keep_alive` options are supported. 290 291* Resolvers do not support service names, only numbers. I.e. you must 292 use "80" rather than "http". 293 294* Most resolver query flags have no effect. 295 296Demultiplexing mechanism: 297 298* Uses the `Windows::Networking::Sockets::StreamSocket` class to implement 299 asynchronous TCP socket operations. 300 301Threads: 302 303* Event completions are delivered to the Windows thread pool and posted to the 304 `io_context` for the handler to be executed. 305 306* An additional thread per `io_context` is used to trigger timers. This thread 307 is created on construction of the first timer objects. 308 309Scatter-Gather: 310 311* For sockets, at most one buffer may be transferred in a single operation. 312 313 314[endsect] 315