[/
 / Copyright (c) 2003-2011 Christopher M. Kohlhoff (chris at kohlhoff dot com)
 /
 / Distributed under the Boost Software License, Version 1.0. (See accompanying
 / file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
 /]

[section:implementation Platform-Specific Implementation Notes]

This section lists platform-specific implementation details, such as the
default demultiplexing mechanism, the number of threads created internally, and
when threads are created.


[heading Linux Kernel 2.4]

Demultiplexing mechanism:

* Uses `select` for demultiplexing. This means that the number of file
descriptors in the process cannot be permitted to exceed `FD_SETSIZE`.

Threads:

* Demultiplexing using `select` is performed in one of the threads that calls
`io_service::run()`, `io_service::run_one()`, `io_service::poll()` or
`io_service::poll_one()`.

* An additional thread per `io_service` is used to emulate asynchronous host
resolution. This thread is created on the first call to either
`ip::tcp::resolver::async_resolve()` or `ip::udp::resolver::async_resolve()`.

Scatter-Gather:

* At most `min(64,IOV_MAX)` buffers may be transferred in a single operation.

[heading Linux Kernel 2.6]

Demultiplexing mechanism:

* Uses `epoll` for demultiplexing.

Threads:

* Demultiplexing using `epoll` is performed in one of the threads that calls
`io_service::run()`, `io_service::run_one()`, `io_service::poll()` or
`io_service::poll_one()`.

* An additional thread per `io_service` is used to emulate asynchronous host
resolution. This thread is created on the first call to either
`ip::tcp::resolver::async_resolve()` or `ip::udp::resolver::async_resolve()`.

Scatter-Gather:

* At most `min(64,IOV_MAX)` buffers may be transferred in a single operation.


[heading Solaris]

Demultiplexing mechanism:

* Uses [^/dev/poll] for demultiplexing.

Threads:

* Demultiplexing using [^/dev/poll] is performed in one of the threads that
calls `io_service::run()`, `io_service::run_one()`, `io_service::poll()` or
`io_service::poll_one()`.

* An additional thread per `io_service` is used to emulate asynchronous host
resolution. This thread is created on the first call to either
`ip::tcp::resolver::async_resolve()` or `ip::udp::resolver::async_resolve()`.

Scatter-Gather:

* At most `min(64,IOV_MAX)` buffers may be transferred in a single operation.


[heading QNX Neutrino]

Demultiplexing mechanism:

* Uses `select` for demultiplexing. This means that the number of file
descriptors in the process cannot be permitted to exceed `FD_SETSIZE`.

Threads:

* Demultiplexing using `select` is performed in one of the threads that calls
`io_service::run()`, `io_service::run_one()`, `io_service::poll()` or
`io_service::poll_one()`.

* An additional thread per `io_service` is used to emulate asynchronous host
resolution. This thread is created on the first call to either
`ip::tcp::resolver::async_resolve()` or `ip::udp::resolver::async_resolve()`.

Scatter-Gather:

* At most `min(64,IOV_MAX)` buffers may be transferred in a single operation.


[heading Mac OS X]

Demultiplexing mechanism:

* Uses `kqueue` for demultiplexing.

Threads:

* Demultiplexing using `kqueue` is performed in one of the threads that calls
`io_service::run()`, `io_service::run_one()`, `io_service::poll()` or
`io_service::poll_one()`.

* An additional thread per `io_service` is used to emulate asynchronous host
resolution. This thread is created on the first call to either
`ip::tcp::resolver::async_resolve()` or `ip::udp::resolver::async_resolve()`.

Scatter-Gather:

* At most `min(64,IOV_MAX)` buffers may be transferred in a single operation.


[heading FreeBSD]

Demultiplexing mechanism:

* Uses `kqueue` for demultiplexing.

Threads:

* Demultiplexing using `kqueue` is performed in one of the threads that calls
`io_service::run()`, `io_service::run_one()`, `io_service::poll()` or
`io_service::poll_one()`.

* An additional thread per `io_service` is used to emulate asynchronous host
resolution. This thread is created on the first call to either
`ip::tcp::resolver::async_resolve()` or `ip::udp::resolver::async_resolve()`.

Scatter-Gather:

* At most `min(64,IOV_MAX)` buffers may be transferred in a single operation.


[heading AIX]

Demultiplexing mechanism:

* Uses `select` for demultiplexing. This means that the number of file
descriptors in the process cannot be permitted to exceed `FD_SETSIZE`.

Threads:

* Demultiplexing using `select` is performed in one of the threads that calls
`io_service::run()`, `io_service::run_one()`, `io_service::poll()` or
`io_service::poll_one()`.

* An additional thread per `io_service` is used to emulate asynchronous host
resolution. This thread is created on the first call to either
`ip::tcp::resolver::async_resolve()` or `ip::udp::resolver::async_resolve()`.

Scatter-Gather:

* At most `min(64,IOV_MAX)` buffers may be transferred in a single operation.


[heading HP-UX]

Demultiplexing mechanism:

* Uses `select` for demultiplexing. This means that the number of file
descriptors in the process cannot be permitted to exceed `FD_SETSIZE`.

Threads:

* Demultiplexing using `select` is performed in one of the threads that calls
`io_service::run()`, `io_service::run_one()`, `io_service::poll()` or
`io_service::poll_one()`.

* An additional thread per `io_service` is used to emulate asynchronous host
resolution. This thread is created on the first call to either
`ip::tcp::resolver::async_resolve()` or `ip::udp::resolver::async_resolve()`.

Scatter-Gather:

* At most `min(64,IOV_MAX)` buffers may be transferred in a single operation.


[heading Tru64]

Demultiplexing mechanism:

* Uses `select` for demultiplexing. This means that the number of file
descriptors in the process cannot be permitted to exceed `FD_SETSIZE`.

Threads:

* Demultiplexing using `select` is performed in one of the threads that calls
`io_service::run()`, `io_service::run_one()`, `io_service::poll()` or
`io_service::poll_one()`.

* An additional thread per `io_service` is used to emulate asynchronous host
resolution. This thread is created on the first call to either
`ip::tcp::resolver::async_resolve()` or `ip::udp::resolver::async_resolve()`.

Scatter-Gather:

* At most `min(64,IOV_MAX)` buffers may be transferred in a single operation.


[heading Windows 95, 98 and Me]

Demultiplexing mechanism:

* Uses `select` for demultiplexing.

Threads:

* Demultiplexing using `select` is performed in one of the threads that calls
`io_service::run()`, `io_service::run_one()`, `io_service::poll()` or
`io_service::poll_one()`.

* An additional thread per `io_service` is used to emulate asynchronous host
resolution. This thread is created on the first call to either
`ip::tcp::resolver::async_resolve()` or `ip::udp::resolver::async_resolve()`.

Scatter-Gather:

* For sockets, at most 16 buffers may be transferred in a single operation.


[heading Windows NT, 2000, XP, 2003 and Vista]

Demultiplexing mechanism:

* Uses overlapped I/O and I/O completion ports for all asynchronous socket
operations except for asynchronous connect.

* Uses `select` for emulating asynchronous connect.

Threads:

* Demultiplexing using I/O completion ports is performed in all threads that call
`io_service::run()`, `io_service::run_one()`, `io_service::poll()` or
`io_service::poll_one()`.

* An additional thread per `io_service` is used to trigger timers. This thread
is created on construction of the first `deadline_timer` or
`deadline_timer_service` objects.

* An additional thread per `io_service` is used for the `select`
demultiplexing. This thread is created on the first call to `async_connect()`.

* An additional thread per `io_service` is used to emulate asynchronous host
resolution. This thread is created on the first call to either
`ip::tcp::resolver::async_resolve()` or `ip::udp::resolver::async_resolve()`.

Scatter-Gather:

* For sockets, at most 64 buffers may be transferred in a single operation.

* For stream-oriented handles, only one buffer may be transferred in a single
operation.


[endsect]
