|
Boost : |
From: Andrew Schweitzer (a.schweitzer.grps_at_[hidden])
Date: 2006-01-02 18:54:19
More notes/examples. Let me know if anything needs to be refined.
In particular, are there other examples that would be useful, off the
top of your head?
--------------Services on Windows-----------------
This is a complete (?) list of creatable on Windows NT 4.0 and above.
**Services are created at run-time when a user-level object (e.g. a
stream_socket) that needs them is created.
**Services in this list with the same name will be re-used if they
already exist. So, for example, if user creates a socket_acceptor then a
stream_socket, the socket_acceptor will add the win_iocp_socket_service
and the select_reactor<true> services, and then the stream_socket will
find and re-use them.
**The first item in each hierarchy is the user-level object whose
instantiation creates the hierarchy. The reset of the items are
services.
demuxer
demuxer_service
win_iocp_demuxer_service
stream_socket
stream_socket_service
win_iocp_socket_service
select_reactor<true>
datagram_socket
datagram_socket_service
win_iocp_socket_service
select_reactor<true>
acceptor_socket
socket_acceptor_service
win_iocp_socket_service
select_reactor<true>
deadline_timer
deadline_timer_service
reactive_deadline_timer_service
select_reactor<true>
locking_dispatcher
locking_dispatcher_service [with one set of template parameters]
locking_dispatcher_service [with another set of template
parameters] (??)
host_resolver
host_resolver_service [with one set of template parameters]
host_resolver_service [with another set of template parameters] (??)
ssl::context
context_service
openssl_context_service
ssl::stream
stream_service
openssl_stream_service
--------------Platform differences----------------
Platform: Uses:
linux 2.5.45 and above epoll
Mac kqueue
Windows NT 4.0 and above IoCompletionPort
Everything else select
In general specialized services look like this:
Layer Class
0 user-level object
1 asio-level service
2 general-concept-implementation service
3 platform-implementation service
In general specialized services look like this:
Layer Example class
0 stream_socket
1 stream_socket_service
2 reactive_socket_service
3 epoll_reactor
**For the demuxer_service and the socket services, WinNT 4.0 doesn't use
the general-concept-implementation service but intstead has it's own
"win_iocp-conecpt-implementation" classes.
**All three socket services share the same conecept-implementation and
platform-implementation-services.
**Not all services have platform-specific implementations.
locking_dispatcher, host_resolver and the ssl services context and
stream are the same on all platforms.
Comparison of specialized servives on Windows and Linux:
SHARED NT LINUX
0 demuxer
1 demuxer_service
2 win_iocp_demuxer_service task_demuxer_service
3 [none] epoll_reactor<false>
0 stream_socket
1 stream_socket_service
2 win_iocp_socket_service reactive_socket_service
3 select_reactor<true> epoll_reactor<false>
0 datagram_socket
1 datagram_socket_service
2 win_iocp_socket_service reactive_socket_service
3 select_reactor<true> epoll_reactor<false>
0 acceptor_socket
1 socket_acceptor_service
2 win_iocp_socket_service reactive_socket_service
3 select_reactor<true> epoll_reactor<false>
0 deadline_timer
1 deadline_timer_service
2 reactive_deadline_timer_service
3 select_reactor<true> epoll_reactor<false>
--------------------------Example------------------
Example of a Windows program using:
*asynchronous timer callbacks,
*asynchronous socket i/o,
*tcp and udp
*serving, via stream_socketasync_accept
*one demuxer shared between timer and socket code.
*no additional threads beyond main() and threads created by library.
In this example, the demuxer is created first (it has to be), then a
stream_socket is created, then an async_timer is created, finally
demuxer::run is called.
1) demuxer::demuxer() creates:
demuxer_service creates:
win_iocp_demuxer_service
The demuxer now has 2 services:
demuxer_service
win_iocp_demuxer_service
No additional threads are running.
The win_iocp_demuxer_service has allocated a Windows IoCompletionPort.
2) stream_socket::stream_socket(demuxer) creates:
stream_socket_service creates:
win_iocp_socket_service creates:
select_reactor<true> (a service)
The demuxer now has 5 services:
demuxer_service
win_iocp_demuxer_service
stream_socket_service
win_iocp_socket_service
select_reactor<true>
The select_reactor service has started a thread. The behavior of this
thread depends on whether any async winsock calls are made If
none are made the thread will call Sleep(till next timer expires);
otherwise it will call select(with timeout when next timer expires).
When this thread has nothing to do it will call select and wait to
be interrupted.
3) datagram_socket::datagram_socket(demuxer) creates:
datagram_socket_servivice finds already existing:
win_iocp_socket_service
The demuxer now has 6 services:
demuxer_service
win_iocp_demuxer_service
stream_socket_service
win_iocp_socket_service
select_reactor<true>
datagram_socket_service
4) acceptor_socket::acceptor_socket(demuxer) creates:
socket_acceptor_service finds already existing:
win_iocp_socket_service
The demuxer now has 7 services:
demuxer_service
win_iocp_demuxer_service
stream_socket_service
win_iocp_socket_service
select_reactor<true>
datagram_socket_service
socket_acceptor_service
5) deadline_timer::deadline_timer(demuxer) creates:
deadline_timer_service creates:
reactive_deadline_timer_service finds already existing:
select_reactor<true>
The demuxer now has 8 services:
demuxer_service
win_iocp_demuxer_service
stream_socket_service
win_iocp_socket_service
select_reactor<true>
deadline_timer_service
reactive_deadline_timer_service
No additional threads are running.
However, in order to use asynchronous callbacks, demuxer::run must
be called in some thread.
6) demuxer::run() is called in WinMain.
There are now two threads running:
select_reactor thread executes select_reactor which
loops on Sleep(till next timer expires)
main thread executes demuxer::run which loops on
GetQueuedCompletionStatus and executes completion
handlers.
Boost list run by bdawes at acm.org, gregod at cs.rpi.edu, cpdaniel at pacbell.net, john at johnmaddock.co.uk