include/boost/corosio/detail/object_pool.hpp
94.2% Lines (65 / 69)
78.6% Branches (33 / 42)
98.7% Functions (150 / 152)
Functions (152)
Function
Calls
Lines
Branches
Blocks
boost::corosio::detail::object_pool<boost::corosio::detail::(anonymous namespace)::pool_impl>::is_pooled(boost::corosio::detail::(anonymous namespace)::pool_impl const*)
:78
24x
100.0%
–
64.7%
boost::corosio::detail::object_pool<boost::corosio::detail::(anonymous namespace)::self_ref_derived>::is_pooled(boost::corosio::detail::(anonymous namespace)::self_ref_derived const*)
:78
1x
100.0%
–
64.7%
boost::corosio::detail::object_pool<boost::corosio::detail::(anonymous namespace)::self_ref_impl>::is_pooled(boost::corosio::detail::(anonymous namespace)::self_ref_impl const*)
:78
1x
100.0%
–
64.7%
boost::corosio::detail::object_pool<boost::corosio::detail::timer::implementation>::is_pooled(boost::corosio::detail::timer::implementation const*)
:78
10161x
100.0%
–
64.7%
boost::corosio::detail::object_pool<boost::corosio::detail::win_local_stream_acceptor>::is_pooled(boost::corosio::detail::win_local_stream_acceptor const*)
:78
159x
100.0%
–
64.7%
boost::corosio::detail::object_pool<boost::corosio::detail::win_local_stream_socket>::is_pooled(boost::corosio::detail::win_local_stream_socket const*)
:78
436x
100.0%
–
64.7%
boost::corosio::detail::object_pool<boost::corosio::detail::win_object_handle_impl>::is_pooled(boost::corosio::detail::win_object_handle_impl const*)
:78
5652x
100.0%
–
64.7%
boost::corosio::detail::object_pool<boost::corosio::detail::win_random_access_file>::is_pooled(boost::corosio::detail::win_random_access_file const*)
:78
234x
100.0%
–
64.7%
boost::corosio::detail::object_pool<boost::corosio::detail::win_random_access_handle_impl>::is_pooled(boost::corosio::detail::win_random_access_handle_impl const*)
:78
50x
100.0%
–
64.7%
boost::corosio::detail::object_pool<boost::corosio::detail::win_resolver>::is_pooled(boost::corosio::detail::win_resolver const*)
:78
132x
100.0%
–
64.7%
boost::corosio::detail::object_pool<boost::corosio::detail::win_signal>::is_pooled(boost::corosio::detail::win_signal const*)
:78
3382x
100.0%
–
64.7%
boost::corosio::detail::object_pool<boost::corosio::detail::win_stream_file>::is_pooled(boost::corosio::detail::win_stream_file const*)
:78
629x
100.0%
–
64.7%
boost::corosio::detail::object_pool<boost::corosio::detail::win_stream_handle_impl>::is_pooled(boost::corosio::detail::win_stream_handle_impl const*)
:78
70x
100.0%
–
64.7%
boost::corosio::detail::object_pool<boost::corosio::detail::win_tcp_acceptor>::is_pooled(boost::corosio::detail::win_tcp_acceptor const*)
:78
3898x
100.0%
–
64.7%
boost::corosio::detail::object_pool<boost::corosio::detail::win_tcp_socket>::is_pooled(boost::corosio::detail::win_tcp_socket const*)
:78
13588x
100.0%
–
64.7%
boost::corosio::detail::object_pool<boost::corosio::detail::win_udp_socket>::is_pooled(boost::corosio::detail::win_udp_socket const*)
:78
339x
100.0%
–
64.7%
boost::corosio::detail::object_pool<boost::corosio::detail::(anonymous namespace)::pool_impl>::adopt(boost::corosio::detail::(anonymous namespace)::pool_impl*)
:102
10x
85.7%
60.0%
70.6%
boost::corosio::detail::object_pool<boost::corosio::detail::(anonymous namespace)::self_ref_derived>::adopt(boost::corosio::detail::(anonymous namespace)::self_ref_derived*)
:102
1x
85.7%
60.0%
70.6%
boost::corosio::detail::object_pool<boost::corosio::detail::(anonymous namespace)::self_ref_impl>::adopt(boost::corosio::detail::(anonymous namespace)::self_ref_impl*)
:102
1x
85.7%
60.0%
70.6%
boost::corosio::detail::object_pool<boost::corosio::detail::timer::implementation>::adopt(boost::corosio::detail::timer::implementation*)
:102
5081x
85.7%
60.0%
70.6%
boost::corosio::detail::object_pool<boost::corosio::detail::win_local_stream_acceptor>::adopt(boost::corosio::detail::win_local_stream_acceptor*)
:102
62x
85.7%
60.0%
70.6%
boost::corosio::detail::object_pool<boost::corosio::detail::win_local_stream_socket>::adopt(boost::corosio::detail::win_local_stream_socket*)
:102
140x
85.7%
60.0%
70.6%
boost::corosio::detail::object_pool<boost::corosio::detail::win_object_handle_impl>::adopt(boost::corosio::detail::win_object_handle_impl*)
:102
2826x
85.7%
60.0%
70.6%
boost::corosio::detail::object_pool<boost::corosio::detail::win_random_access_file>::adopt(boost::corosio::detail::win_random_access_file*)
:102
117x
85.7%
60.0%
70.6%
boost::corosio::detail::object_pool<boost::corosio::detail::win_random_access_handle_impl>::adopt(boost::corosio::detail::win_random_access_handle_impl*)
:102
25x
85.7%
60.0%
70.6%
boost::corosio::detail::object_pool<boost::corosio::detail::win_resolver>::adopt(boost::corosio::detail::win_resolver*)
:102
66x
85.7%
60.0%
70.6%
boost::corosio::detail::object_pool<boost::corosio::detail::win_signal>::adopt(boost::corosio::detail::win_signal*)
:102
1689x
85.7%
60.0%
70.6%
boost::corosio::detail::object_pool<boost::corosio::detail::win_stream_file>::adopt(boost::corosio::detail::win_stream_file*)
:102
314x
85.7%
60.0%
70.6%
boost::corosio::detail::object_pool<boost::corosio::detail::win_stream_handle_impl>::adopt(boost::corosio::detail::win_stream_handle_impl*)
:102
35x
85.7%
60.0%
70.6%
boost::corosio::detail::object_pool<boost::corosio::detail::win_tcp_acceptor>::adopt(boost::corosio::detail::win_tcp_acceptor*)
:102
1156x
85.7%
60.0%
70.6%
boost::corosio::detail::object_pool<boost::corosio::detail::win_tcp_socket>::adopt(boost::corosio::detail::win_tcp_socket*)
:102
4005x
85.7%
60.0%
70.6%
boost::corosio::detail::object_pool<boost::corosio::detail::win_udp_socket>::adopt(boost::corosio::detail::win_udp_socket*)
:102
154x
85.7%
60.0%
70.6%
boost::corosio::detail::object_pool<boost::corosio::detail::(anonymous namespace)::pool_impl>::remove(boost::corosio::detail::(anonymous namespace)::pool_impl*)
:129
3x
83.3%
50.0%
87.5%
boost::corosio::detail::object_pool<boost::corosio::detail::timer::implementation>::remove(boost::corosio::detail::timer::implementation*)
:129
5043x
83.3%
50.0%
87.5%
boost::corosio::detail::object_pool<boost::corosio::detail::(anonymous namespace)::pool_impl>::~object_pool()
:151
8x
100.0%
80.0%
73.0%
boost::corosio::detail::object_pool<boost::corosio::detail::(anonymous namespace)::self_ref_derived>::~object_pool()
:151
1x
100.0%
60.0%
67.6%
boost::corosio::detail::object_pool<boost::corosio::detail::(anonymous namespace)::self_ref_impl>::~object_pool()
:151
1x
100.0%
60.0%
67.6%
boost::corosio::detail::object_pool<boost::corosio::detail::timer::implementation>::~object_pool()
:151
423x
100.0%
80.0%
73.0%
boost::corosio::detail::object_pool<boost::corosio::detail::win_local_stream_acceptor>::~object_pool()
:151
94x
100.0%
60.0%
67.6%
boost::corosio::detail::object_pool<boost::corosio::detail::win_local_stream_socket>::~object_pool()
:151
94x
100.0%
60.0%
67.6%
boost::corosio::detail::object_pool<boost::corosio::detail::win_object_handle_impl>::~object_pool()
:151
2826x
100.0%
60.0%
67.6%
boost::corosio::detail::object_pool<boost::corosio::detail::win_random_access_file>::~object_pool()
:151
89x
100.0%
60.0%
67.6%
boost::corosio::detail::object_pool<boost::corosio::detail::win_random_access_handle_impl>::~object_pool()
:151
25x
100.0%
60.0%
67.6%
boost::corosio::detail::object_pool<boost::corosio::detail::win_resolver>::~object_pool()
:151
65x
100.0%
60.0%
67.6%
boost::corosio::detail::object_pool<boost::corosio::detail::win_signal>::~object_pool()
:151
282x
100.0%
60.0%
67.6%
boost::corosio::detail::object_pool<boost::corosio::detail::win_stream_file>::~object_pool()
:151
286x
100.0%
60.0%
67.6%
boost::corosio::detail::object_pool<boost::corosio::detail::win_stream_handle_impl>::~object_pool()
:151
34x
100.0%
60.0%
67.6%
boost::corosio::detail::object_pool<boost::corosio::detail::win_tcp_acceptor>::~object_pool()
:151
1017x
100.0%
80.0%
73.0%
boost::corosio::detail::object_pool<boost::corosio::detail::win_tcp_socket>::~object_pool()
:151
1017x
100.0%
80.0%
73.0%
boost::corosio::detail::object_pool<boost::corosio::detail::win_udp_socket>::~object_pool()
:151
106x
100.0%
60.0%
67.6%
boost::corosio::detail::object_pool<boost::corosio::detail::(anonymous namespace)::pool_impl>::object_pool()
:164
8x
100.0%
–
100.0%
boost::corosio::detail::object_pool<boost::corosio::detail::(anonymous namespace)::self_ref_derived>::object_pool()
:164
1x
100.0%
–
100.0%
boost::corosio::detail::object_pool<boost::corosio::detail::(anonymous namespace)::self_ref_impl>::object_pool()
:164
1x
100.0%
–
100.0%
boost::corosio::detail::object_pool<boost::corosio::detail::timer::implementation>::object_pool()
:164
423x
100.0%
–
100.0%
boost::corosio::detail::object_pool<boost::corosio::detail::win_local_stream_acceptor>::object_pool()
:164
94x
100.0%
–
100.0%
boost::corosio::detail::object_pool<boost::corosio::detail::win_local_stream_socket>::object_pool()
:164
94x
100.0%
–
100.0%
boost::corosio::detail::object_pool<boost::corosio::detail::win_object_handle_impl>::object_pool()
:164
2826x
100.0%
–
100.0%
boost::corosio::detail::object_pool<boost::corosio::detail::win_random_access_file>::object_pool()
:164
89x
100.0%
–
100.0%
boost::corosio::detail::object_pool<boost::corosio::detail::win_random_access_handle_impl>::object_pool()
:164
25x
100.0%
–
100.0%
boost::corosio::detail::object_pool<boost::corosio::detail::win_resolver>::object_pool()
:164
65x
100.0%
–
100.0%
boost::corosio::detail::object_pool<boost::corosio::detail::win_signal>::object_pool()
:164
282x
100.0%
–
100.0%
boost::corosio::detail::object_pool<boost::corosio::detail::win_stream_file>::object_pool()
:164
286x
100.0%
–
100.0%
boost::corosio::detail::object_pool<boost::corosio::detail::win_stream_handle_impl>::object_pool()
:164
34x
100.0%
–
100.0%
boost::corosio::detail::object_pool<boost::corosio::detail::win_tcp_acceptor>::object_pool()
:164
1017x
100.0%
–
100.0%
boost::corosio::detail::object_pool<boost::corosio::detail::win_tcp_socket>::object_pool()
:164
1017x
100.0%
–
100.0%
boost::corosio::detail::object_pool<boost::corosio::detail::win_udp_socket>::object_pool()
:164
106x
100.0%
–
100.0%
boost::corosio::detail::(anonymous namespace)::pool_impl* boost::corosio::detail::object_pool<boost::corosio::detail::(anonymous namespace)::pool_impl>::acquire<>()
:190
13x
100.0%
85.7%
69.2%
boost::corosio::detail::(anonymous namespace)::self_ref_derived* boost::corosio::detail::object_pool<boost::corosio::detail::(anonymous namespace)::self_ref_derived>::acquire<>()
:190
1x
71.4%
57.1%
33.3%
boost::corosio::detail::(anonymous namespace)::self_ref_impl* boost::corosio::detail::object_pool<boost::corosio::detail::(anonymous namespace)::self_ref_impl>::acquire<>()
:190
1x
71.4%
57.1%
33.3%
boost::corosio::detail::timer::implementation* boost::corosio::detail::object_pool<boost::corosio::detail::timer::implementation>::acquire<boost::corosio::detail::timer_service&>(boost::corosio::detail::timer_service&)
:190
1875x
100.0%
85.7%
70.0%
boost::corosio::detail::win_local_stream_acceptor* boost::corosio::detail::object_pool<boost::corosio::detail::win_local_stream_acceptor>::acquire<boost::corosio::detail::win_local_stream_service&>(boost::corosio::detail::win_local_stream_service&)
:190
97x
100.0%
85.7%
70.0%
boost::corosio::detail::win_local_stream_socket* boost::corosio::detail::object_pool<boost::corosio::detail::win_local_stream_socket>::acquire<boost::corosio::detail::win_local_stream_service&>(boost::corosio::detail::win_local_stream_service&)
:190
296x
100.0%
85.7%
70.0%
boost::corosio::detail::win_object_handle_impl* boost::corosio::detail::object_pool<boost::corosio::detail::win_object_handle_impl>::acquire<boost::corosio::detail::win_object_handle_service&, boost::corosio::detail::win_scheduler&>(boost::corosio::detail::win_object_handle_service&, boost::corosio::detail::win_scheduler&)
:190
2826x
71.4%
57.1%
36.6%
boost::corosio::detail::win_random_access_file* boost::corosio::detail::object_pool<boost::corosio::detail::win_random_access_file>::acquire<boost::corosio::detail::win_random_access_file_service&>(boost::corosio::detail::win_random_access_file_service&)
:190
117x
71.4%
57.1%
35.0%
boost::corosio::detail::win_random_access_handle_impl* boost::corosio::detail::object_pool<boost::corosio::detail::win_random_access_handle_impl>::acquire<boost::corosio::detail::win_random_access_handle_service&, boost::corosio::detail::win_scheduler&>(boost::corosio::detail::win_random_access_handle_service&, boost::corosio::detail::win_scheduler&)
:190
25x
71.4%
57.1%
36.6%
boost::corosio::detail::win_resolver* boost::corosio::detail::object_pool<boost::corosio::detail::win_resolver>::acquire<boost::corosio::detail::win_resolver_service&>(boost::corosio::detail::win_resolver_service&)
:190
66x
71.4%
57.1%
35.0%
boost::corosio::detail::win_signal* boost::corosio::detail::object_pool<boost::corosio::detail::win_signal>::acquire<boost::corosio::detail::win_signals&>(boost::corosio::detail::win_signals&)
:190
1693x
100.0%
85.7%
70.0%
boost::corosio::detail::win_stream_file* boost::corosio::detail::object_pool<boost::corosio::detail::win_stream_file>::acquire<boost::corosio::detail::win_file_service&>(boost::corosio::detail::win_file_service&)
:190
315x
100.0%
85.7%
70.0%
boost::corosio::detail::win_stream_handle_impl* boost::corosio::detail::object_pool<boost::corosio::detail::win_stream_handle_impl>::acquire<boost::corosio::detail::win_stream_handle_service&, boost::corosio::detail::win_scheduler&>(boost::corosio::detail::win_stream_handle_service&, boost::corosio::detail::win_scheduler&)
:190
35x
71.4%
57.1%
36.6%
boost::corosio::detail::win_tcp_acceptor* boost::corosio::detail::object_pool<boost::corosio::detail::win_tcp_acceptor>::acquire<boost::corosio::detail::win_tcp_service&>(boost::corosio::detail::win_tcp_service&)
:190
2742x
100.0%
85.7%
70.0%
boost::corosio::detail::win_tcp_socket* boost::corosio::detail::object_pool<boost::corosio::detail::win_tcp_socket>::acquire<boost::corosio::detail::win_tcp_service&>(boost::corosio::detail::win_tcp_service&)
:190
9583x
100.0%
85.7%
70.0%
boost::corosio::detail::win_udp_socket* boost::corosio::detail::object_pool<boost::corosio::detail::win_udp_socket>::acquire<boost::corosio::detail::win_udp_service&>(boost::corosio::detail::win_udp_service&)
:190
185x
100.0%
85.7%
70.0%
boost::corosio::detail::object_pool<boost::corosio::detail::(anonymous namespace)::pool_impl>::recycle(boost::corosio::detail::(anonymous namespace)::pool_impl*)
:245
11x
86.7%
72.7%
65.9%
boost::corosio::detail::object_pool<boost::corosio::detail::(anonymous namespace)::self_ref_derived>::recycle(boost::corosio::detail::(anonymous namespace)::self_ref_derived*)
:245
0
0.0%
0.0%
0.0%
boost::corosio::detail::object_pool<boost::corosio::detail::(anonymous namespace)::self_ref_impl>::recycle(boost::corosio::detail::(anonymous namespace)::self_ref_impl*)
:245
0
0.0%
0.0%
0.0%
boost::corosio::detail::object_pool<boost::corosio::detail::timer::implementation>::recycle(boost::corosio::detail::timer::implementation*)
:245
37x
73.3%
45.5%
58.5%
boost::corosio::detail::object_pool<boost::corosio::detail::win_local_stream_acceptor>::recycle(boost::corosio::detail::win_local_stream_acceptor*)
:245
97x
86.7%
72.7%
65.9%
boost::corosio::detail::object_pool<boost::corosio::detail::win_local_stream_socket>::recycle(boost::corosio::detail::win_local_stream_socket*)
:245
296x
86.7%
72.7%
65.9%
boost::corosio::detail::object_pool<boost::corosio::detail::win_object_handle_impl>::recycle(boost::corosio::detail::win_object_handle_impl*)
:245
2826x
86.7%
72.7%
65.9%
boost::corosio::detail::object_pool<boost::corosio::detail::win_random_access_file>::recycle(boost::corosio::detail::win_random_access_file*)
:245
117x
86.7%
72.7%
65.9%
boost::corosio::detail::object_pool<boost::corosio::detail::win_random_access_handle_impl>::recycle(boost::corosio::detail::win_random_access_handle_impl*)
:245
25x
86.7%
72.7%
65.9%
boost::corosio::detail::object_pool<boost::corosio::detail::win_resolver>::recycle(boost::corosio::detail::win_resolver*)
:245
66x
86.7%
72.7%
65.9%
boost::corosio::detail::object_pool<boost::corosio::detail::win_signal>::recycle(boost::corosio::detail::win_signal*)
:245
1693x
86.7%
72.7%
65.9%
boost::corosio::detail::object_pool<boost::corosio::detail::win_stream_file>::recycle(boost::corosio::detail::win_stream_file*)
:245
315x
86.7%
72.7%
65.9%
boost::corosio::detail::object_pool<boost::corosio::detail::win_stream_handle_impl>::recycle(boost::corosio::detail::win_stream_handle_impl*)
:245
35x
86.7%
72.7%
65.9%
boost::corosio::detail::object_pool<boost::corosio::detail::win_tcp_acceptor>::recycle(boost::corosio::detail::win_tcp_acceptor*)
:245
2742x
86.7%
72.7%
65.9%
boost::corosio::detail::object_pool<boost::corosio::detail::win_tcp_socket>::recycle(boost::corosio::detail::win_tcp_socket*)
:245
9583x
86.7%
72.7%
65.9%
boost::corosio::detail::object_pool<boost::corosio::detail::win_udp_socket>::recycle(boost::corosio::detail::win_udp_socket*)
:245
185x
86.7%
72.7%
65.9%
void boost::corosio::detail::object_pool<boost::corosio::detail::(anonymous namespace)::pool_impl>::shutdown<boost::corosio::detail::object_pool_test::run()::{lambda(boost::corosio::detail::(anonymous namespace)::pool_impl*)#1}>(boost::corosio::detail::object_pool_test::run()::{lambda(boost::corosio::detail::(anonymous namespace)::pool_impl*)#1}&&)
:292
1x
100.0%
100.0%
75.0%
void boost::corosio::detail::object_pool<boost::corosio::detail::(anonymous namespace)::pool_impl>::shutdown<boost::corosio::detail::object_pool_test::run()::{lambda(boost::corosio::detail::(anonymous namespace)::pool_impl*)#2}>(boost::corosio::detail::object_pool_test::run()::{lambda(boost::corosio::detail::(anonymous namespace)::pool_impl*)#2}&&)
:292
1x
100.0%
100.0%
75.0%
void boost::corosio::detail::object_pool<boost::corosio::detail::(anonymous namespace)::pool_impl>::shutdown<boost::corosio::detail::object_pool_test::run()::{lambda(boost::corosio::detail::(anonymous namespace)::pool_impl*)#3}>(boost::corosio::detail::object_pool_test::run()::{lambda(boost::corosio::detail::(anonymous namespace)::pool_impl*)#3}&&)
:292
1x
100.0%
100.0%
75.0%
void boost::corosio::detail::object_pool<boost::corosio::detail::(anonymous namespace)::self_ref_derived>::shutdown<boost::corosio::detail::object_pool_test::run()::{lambda(boost::corosio::detail::(anonymous namespace)::self_ref_derived*)#1}>(boost::corosio::detail::object_pool_test::run()::{lambda(boost::corosio::detail::(anonymous namespace)::self_ref_derived*)#1}&&)
:292
1x
100.0%
100.0%
75.0%
void boost::corosio::detail::object_pool<boost::corosio::detail::(anonymous namespace)::self_ref_impl>::shutdown<boost::corosio::detail::object_pool_test::run()::{lambda(boost::corosio::detail::(anonymous namespace)::self_ref_impl*)#1}>(boost::corosio::detail::object_pool_test::run()::{lambda(boost::corosio::detail::(anonymous namespace)::self_ref_impl*)#1}&&)
:292
1x
100.0%
100.0%
75.0%
void boost::corosio::detail::object_pool<boost::corosio::detail::timer::implementation>::shutdown<boost::corosio::detail::timer_service::shutdown()::{lambda(boost::corosio::detail::timer::implementation*)#1}>(boost::corosio::detail::timer_service::shutdown()::{lambda(boost::corosio::detail::timer::implementation*)#1}&&)
:292
420x
100.0%
85.7%
75.0%
void boost::corosio::detail::object_pool<boost::corosio::detail::win_local_stream_acceptor>::shutdown<boost::corosio::detail::win_local_stream_service::shutdown()::{lambda(boost::corosio::detail::win_local_stream_acceptor*)#1}>(boost::corosio::detail::win_local_stream_service::shutdown()::{lambda(boost::corosio::detail::win_local_stream_acceptor*)#1}&&)
:292
94x
100.0%
100.0%
75.0%
void boost::corosio::detail::object_pool<boost::corosio::detail::win_local_stream_socket>::shutdown<boost::corosio::detail::win_local_stream_service::shutdown()::{lambda(boost::corosio::detail::win_local_stream_socket*)#1}>(boost::corosio::detail::win_local_stream_service::shutdown()::{lambda(boost::corosio::detail::win_local_stream_socket*)#1}&&)
:292
94x
100.0%
100.0%
75.0%
void boost::corosio::detail::object_pool<boost::corosio::detail::win_object_handle_impl>::shutdown<boost::corosio::detail::win_object_handle_service::shutdown()::{lambda(boost::corosio::detail::win_object_handle_impl*)#1}>(boost::corosio::detail::win_object_handle_service::shutdown()::{lambda(boost::corosio::detail::win_object_handle_impl*)#1}&&)
:292
2826x
100.0%
100.0%
75.0%
void boost::corosio::detail::object_pool<boost::corosio::detail::win_random_access_file>::shutdown<boost::corosio::detail::win_random_access_file_service::shutdown()::{lambda(boost::corosio::detail::win_random_access_file*)#1}>(boost::corosio::detail::win_random_access_file_service::shutdown()::{lambda(boost::corosio::detail::win_random_access_file*)#1}&&)
:292
89x
80.0%
71.4%
75.0%
void boost::corosio::detail::object_pool<boost::corosio::detail::win_random_access_handle_impl>::shutdown<boost::corosio::detail::win_random_access_handle_service::shutdown()::{lambda(boost::corosio::detail::win_random_access_handle_impl*)#1}>(boost::corosio::detail::win_random_access_handle_service::shutdown()::{lambda(boost::corosio::detail::win_random_access_handle_impl*)#1}&&)
:292
25x
100.0%
100.0%
75.0%
void boost::corosio::detail::object_pool<boost::corosio::detail::win_resolver>::shutdown<boost::corosio::detail::win_resolver_service::shutdown()::{lambda(boost::corosio::detail::win_resolver*)#1}>(boost::corosio::detail::win_resolver_service::shutdown()::{lambda(boost::corosio::detail::win_resolver*)#1}&&)
:292
65x
80.0%
71.4%
75.0%
void boost::corosio::detail::object_pool<boost::corosio::detail::win_signal>::shutdown<boost::corosio::detail::win_signals::shutdown()::{lambda(boost::corosio::detail::win_signal*)#1}>(boost::corosio::detail::win_signals::shutdown()::{lambda(boost::corosio::detail::win_signal*)#1}&&)
:292
282x
80.0%
71.4%
75.0%
void boost::corosio::detail::object_pool<boost::corosio::detail::win_stream_file>::shutdown<boost::corosio::detail::win_file_service::shutdown()::{lambda(boost::corosio::detail::win_stream_file*)#1}>(boost::corosio::detail::win_file_service::shutdown()::{lambda(boost::corosio::detail::win_stream_file*)#1}&&)
:292
286x
80.0%
71.4%
75.0%
void boost::corosio::detail::object_pool<boost::corosio::detail::win_stream_handle_impl>::shutdown<boost::corosio::detail::win_stream_handle_service::shutdown()::{lambda(boost::corosio::detail::win_stream_handle_impl*)#1}>(boost::corosio::detail::win_stream_handle_service::shutdown()::{lambda(boost::corosio::detail::win_stream_handle_impl*)#1}&&)
:292
34x
100.0%
100.0%
75.0%
void boost::corosio::detail::object_pool<boost::corosio::detail::win_tcp_acceptor>::shutdown<boost::corosio::detail::win_tcp_service::shutdown()::{lambda(boost::corosio::detail::win_tcp_acceptor*)#1}>(boost::corosio::detail::win_tcp_service::shutdown()::{lambda(boost::corosio::detail::win_tcp_acceptor*)#1}&&)
:292
1016x
100.0%
100.0%
75.0%
void boost::corosio::detail::object_pool<boost::corosio::detail::win_tcp_socket>::shutdown<boost::corosio::detail::win_tcp_service::shutdown()::{lambda(boost::corosio::detail::win_tcp_socket*)#1}>(boost::corosio::detail::win_tcp_service::shutdown()::{lambda(boost::corosio::detail::win_tcp_socket*)#1}&&)
:292
1016x
100.0%
100.0%
75.0%
void boost::corosio::detail::object_pool<boost::corosio::detail::win_udp_socket>::shutdown<boost::corosio::detail::win_udp_service::shutdown()::{lambda(boost::corosio::detail::win_udp_socket*)#1}>(boost::corosio::detail::win_udp_service::shutdown()::{lambda(boost::corosio::detail::win_udp_socket*)#1}&&)
:292
106x
80.0%
71.4%
75.0%
boost::corosio::detail::object_pool<boost::corosio::detail::(anonymous namespace)::pool_impl>::shutdown<boost::corosio::detail::object_pool_test::run()::{lambda(boost::corosio::detail::(anonymous namespace)::pool_impl*)#1}>(boost::corosio::detail::object_pool_test::run()::{lambda(boost::corosio::detail::(anonymous namespace)::pool_impl*)#1}&&)::{lambda(boost::corosio::detail::(anonymous namespace)::pool_impl*)#1}::operator()(boost::corosio::detail::(anonymous namespace)::pool_impl*) const
:300
1x
100.0%
–
100.0%
boost::corosio::detail::object_pool<boost::corosio::detail::(anonymous namespace)::pool_impl>::shutdown<boost::corosio::detail::object_pool_test::run()::{lambda(boost::corosio::detail::(anonymous namespace)::pool_impl*)#2}>(boost::corosio::detail::object_pool_test::run()::{lambda(boost::corosio::detail::(anonymous namespace)::pool_impl*)#2}&&)::{lambda(boost::corosio::detail::(anonymous namespace)::pool_impl*)#1}::operator()(boost::corosio::detail::(anonymous namespace)::pool_impl*) const
:300
2x
100.0%
–
100.0%
boost::corosio::detail::object_pool<boost::corosio::detail::(anonymous namespace)::pool_impl>::shutdown<boost::corosio::detail::object_pool_test::run()::{lambda(boost::corosio::detail::(anonymous namespace)::pool_impl*)#3}>(boost::corosio::detail::object_pool_test::run()::{lambda(boost::corosio::detail::(anonymous namespace)::pool_impl*)#3}&&)::{lambda(boost::corosio::detail::(anonymous namespace)::pool_impl*)#1}::operator()(boost::corosio::detail::(anonymous namespace)::pool_impl*) const
:300
1x
100.0%
–
100.0%
boost::corosio::detail::object_pool<boost::corosio::detail::(anonymous namespace)::self_ref_derived>::shutdown<boost::corosio::detail::object_pool_test::run()::{lambda(boost::corosio::detail::(anonymous namespace)::self_ref_derived*)#1}>(boost::corosio::detail::object_pool_test::run()::{lambda(boost::corosio::detail::(anonymous namespace)::self_ref_derived*)#1}&&)::{lambda(boost::corosio::detail::(anonymous namespace)::self_ref_derived*)#1}::operator()(boost::corosio::detail::(anonymous namespace)::self_ref_derived*) const
:300
1x
100.0%
–
100.0%
boost::corosio::detail::object_pool<boost::corosio::detail::(anonymous namespace)::self_ref_impl>::shutdown<boost::corosio::detail::object_pool_test::run()::{lambda(boost::corosio::detail::(anonymous namespace)::self_ref_impl*)#1}>(boost::corosio::detail::object_pool_test::run()::{lambda(boost::corosio::detail::(anonymous namespace)::self_ref_impl*)#1}&&)::{lambda(boost::corosio::detail::(anonymous namespace)::self_ref_impl*)#1}::operator()(boost::corosio::detail::(anonymous namespace)::self_ref_impl*) const
:300
1x
100.0%
–
100.0%
boost::corosio::detail::object_pool<boost::corosio::detail::timer::implementation>::shutdown<boost::corosio::detail::timer_service::shutdown()::{lambda(boost::corosio::detail::timer::implementation*)#1}>(boost::corosio::detail::timer_service::shutdown()::{lambda(boost::corosio::detail::timer::implementation*)#1}&&)::{lambda(boost::corosio::detail::timer::implementation*)#1}::operator()(boost::corosio::detail::timer::implementation*) const
:300
1647x
100.0%
–
100.0%
boost::corosio::detail::object_pool<boost::corosio::detail::win_local_stream_acceptor>::shutdown<boost::corosio::detail::win_local_stream_service::shutdown()::{lambda(boost::corosio::detail::win_local_stream_acceptor*)#1}>(boost::corosio::detail::win_local_stream_service::shutdown()::{lambda(boost::corosio::detail::win_local_stream_acceptor*)#1}&&)::{lambda(boost::corosio::detail::win_local_stream_acceptor*)#1}::operator()(boost::corosio::detail::win_local_stream_acceptor*) const
:300
2x
100.0%
–
100.0%
boost::corosio::detail::object_pool<boost::corosio::detail::win_local_stream_socket>::shutdown<boost::corosio::detail::win_local_stream_service::shutdown()::{lambda(boost::corosio::detail::win_local_stream_socket*)#1}>(boost::corosio::detail::win_local_stream_service::shutdown()::{lambda(boost::corosio::detail::win_local_stream_socket*)#1}&&)::{lambda(boost::corosio::detail::win_local_stream_socket*)#1}::operator()(boost::corosio::detail::win_local_stream_socket*) const
:300
7x
100.0%
–
100.0%
boost::corosio::detail::object_pool<boost::corosio::detail::win_object_handle_impl>::shutdown<boost::corosio::detail::win_object_handle_service::shutdown()::{lambda(boost::corosio::detail::win_object_handle_impl*)#1}>(boost::corosio::detail::win_object_handle_service::shutdown()::{lambda(boost::corosio::detail::win_object_handle_impl*)#1}&&)::{lambda(boost::corosio::detail::win_object_handle_impl*)#1}::operator()(boost::corosio::detail::win_object_handle_impl*) const
:300
1x
100.0%
–
100.0%
boost::corosio::detail::object_pool<boost::corosio::detail::win_random_access_file>::shutdown<boost::corosio::detail::win_random_access_file_service::shutdown()::{lambda(boost::corosio::detail::win_random_access_file*)#1}>(boost::corosio::detail::win_random_access_file_service::shutdown()::{lambda(boost::corosio::detail::win_random_access_file*)#1}&&)::{lambda(boost::corosio::detail::win_random_access_file*)#1}::operator()(boost::corosio::detail::win_random_access_file*) const
:300
1x
100.0%
–
100.0%
boost::corosio::detail::object_pool<boost::corosio::detail::win_random_access_handle_impl>::shutdown<boost::corosio::detail::win_random_access_handle_service::shutdown()::{lambda(boost::corosio::detail::win_random_access_handle_impl*)#1}>(boost::corosio::detail::win_random_access_handle_service::shutdown()::{lambda(boost::corosio::detail::win_random_access_handle_impl*)#1}&&)::{lambda(boost::corosio::detail::win_random_access_handle_impl*)#1}::operator()(boost::corosio::detail::win_random_access_handle_impl*) const
:300
2x
100.0%
–
100.0%
boost::corosio::detail::object_pool<boost::corosio::detail::win_resolver>::shutdown<boost::corosio::detail::win_resolver_service::shutdown()::{lambda(boost::corosio::detail::win_resolver*)#1}>(boost::corosio::detail::win_resolver_service::shutdown()::{lambda(boost::corosio::detail::win_resolver*)#1}&&)::{lambda(boost::corosio::detail::win_resolver*)#1}::operator()(boost::corosio::detail::win_resolver*) const
:300
7x
100.0%
–
100.0%
boost::corosio::detail::object_pool<boost::corosio::detail::win_signal>::shutdown<boost::corosio::detail::win_signals::shutdown()::{lambda(boost::corosio::detail::win_signal*)#1}>(boost::corosio::detail::win_signals::shutdown()::{lambda(boost::corosio::detail::win_signal*)#1}&&)::{lambda(boost::corosio::detail::win_signal*)#1}::operator()(boost::corosio::detail::win_signal*) const
:300
1605x
100.0%
–
100.0%
boost::corosio::detail::object_pool<boost::corosio::detail::win_stream_file>::shutdown<boost::corosio::detail::win_file_service::shutdown()::{lambda(boost::corosio::detail::win_stream_file*)#1}>(boost::corosio::detail::win_file_service::shutdown()::{lambda(boost::corosio::detail::win_stream_file*)#1}&&)::{lambda(boost::corosio::detail::win_stream_file*)#1}::operator()(boost::corosio::detail::win_stream_file*) const
:300
1x
100.0%
–
100.0%
boost::corosio::detail::object_pool<boost::corosio::detail::win_stream_handle_impl>::shutdown<boost::corosio::detail::win_stream_handle_service::shutdown()::{lambda(boost::corosio::detail::win_stream_handle_impl*)#1}>(boost::corosio::detail::win_stream_handle_service::shutdown()::{lambda(boost::corosio::detail::win_stream_handle_impl*)#1}&&)::{lambda(boost::corosio::detail::win_stream_handle_impl*)#1}::operator()(boost::corosio::detail::win_stream_handle_impl*) const
:300
4x
100.0%
–
100.0%
boost::corosio::detail::object_pool<boost::corosio::detail::win_tcp_acceptor>::shutdown<boost::corosio::detail::win_tcp_service::shutdown()::{lambda(boost::corosio::detail::win_tcp_acceptor*)#1}>(boost::corosio::detail::win_tcp_service::shutdown()::{lambda(boost::corosio::detail::win_tcp_acceptor*)#1}&&)::{lambda(boost::corosio::detail::win_tcp_acceptor*)#1}::operator()(boost::corosio::detail::win_tcp_acceptor*) const
:300
414x
100.0%
–
100.0%
boost::corosio::detail::object_pool<boost::corosio::detail::win_tcp_socket>::shutdown<boost::corosio::detail::win_tcp_service::shutdown()::{lambda(boost::corosio::detail::win_tcp_socket*)#1}>(boost::corosio::detail::win_tcp_service::shutdown()::{lambda(boost::corosio::detail::win_tcp_socket*)#1}&&)::{lambda(boost::corosio::detail::win_tcp_socket*)#1}::operator()(boost::corosio::detail::win_tcp_socket*) const
:300
1235x
100.0%
–
100.0%
boost::corosio::detail::object_pool<boost::corosio::detail::win_udp_socket>::shutdown<boost::corosio::detail::win_udp_service::shutdown()::{lambda(boost::corosio::detail::win_udp_socket*)#1}>(boost::corosio::detail::win_udp_service::shutdown()::{lambda(boost::corosio::detail::win_udp_socket*)#1}&&)::{lambda(boost::corosio::detail::win_udp_socket*)#1}::operator()(boost::corosio::detail::win_udp_socket*) const
:300
4x
100.0%
–
100.0%
boost::corosio::detail::object_pool<boost::corosio::detail::(anonymous namespace)::pool_impl>::shutdown<boost::corosio::detail::object_pool_test::run()::{lambda(boost::corosio::detail::(anonymous namespace)::pool_impl*)#1}>(boost::corosio::detail::object_pool_test::run()::{lambda(boost::corosio::detail::(anonymous namespace)::pool_impl*)#1}&&)::{lambda(boost::corosio::detail::(anonymous namespace)::pool_impl*)#2}::operator()(boost::corosio::detail::(anonymous namespace)::pool_impl*) const
:303
1x
100.0%
–
100.0%
boost::corosio::detail::object_pool<boost::corosio::detail::(anonymous namespace)::pool_impl>::shutdown<boost::corosio::detail::object_pool_test::run()::{lambda(boost::corosio::detail::(anonymous namespace)::pool_impl*)#2}>(boost::corosio::detail::object_pool_test::run()::{lambda(boost::corosio::detail::(anonymous namespace)::pool_impl*)#2}&&)::{lambda(boost::corosio::detail::(anonymous namespace)::pool_impl*)#2}::operator()(boost::corosio::detail::(anonymous namespace)::pool_impl*) const
:303
2x
100.0%
–
100.0%
boost::corosio::detail::object_pool<boost::corosio::detail::(anonymous namespace)::pool_impl>::shutdown<boost::corosio::detail::object_pool_test::run()::{lambda(boost::corosio::detail::(anonymous namespace)::pool_impl*)#3}>(boost::corosio::detail::object_pool_test::run()::{lambda(boost::corosio::detail::(anonymous namespace)::pool_impl*)#3}&&)::{lambda(boost::corosio::detail::(anonymous namespace)::pool_impl*)#2}::operator()(boost::corosio::detail::(anonymous namespace)::pool_impl*) const
:303
1x
100.0%
–
100.0%
boost::corosio::detail::object_pool<boost::corosio::detail::(anonymous namespace)::self_ref_derived>::shutdown<boost::corosio::detail::object_pool_test::run()::{lambda(boost::corosio::detail::(anonymous namespace)::self_ref_derived*)#1}>(boost::corosio::detail::object_pool_test::run()::{lambda(boost::corosio::detail::(anonymous namespace)::self_ref_derived*)#1}&&)::{lambda(boost::corosio::detail::(anonymous namespace)::self_ref_derived*)#2}::operator()(boost::corosio::detail::(anonymous namespace)::self_ref_derived*) const
:303
1x
100.0%
–
100.0%
boost::corosio::detail::object_pool<boost::corosio::detail::(anonymous namespace)::self_ref_impl>::shutdown<boost::corosio::detail::object_pool_test::run()::{lambda(boost::corosio::detail::(anonymous namespace)::self_ref_impl*)#1}>(boost::corosio::detail::object_pool_test::run()::{lambda(boost::corosio::detail::(anonymous namespace)::self_ref_impl*)#1}&&)::{lambda(boost::corosio::detail::(anonymous namespace)::self_ref_impl*)#2}::operator()(boost::corosio::detail::(anonymous namespace)::self_ref_impl*) const
:303
1x
100.0%
–
100.0%
boost::corosio::detail::object_pool<boost::corosio::detail::timer::implementation>::shutdown<boost::corosio::detail::timer_service::shutdown()::{lambda(boost::corosio::detail::timer::implementation*)#1}>(boost::corosio::detail::timer_service::shutdown()::{lambda(boost::corosio::detail::timer::implementation*)#1}&&)::{lambda(boost::corosio::detail::timer::implementation*)#2}::operator()(boost::corosio::detail::timer::implementation*) const
:303
1647x
100.0%
–
100.0%
boost::corosio::detail::object_pool<boost::corosio::detail::win_local_stream_acceptor>::shutdown<boost::corosio::detail::win_local_stream_service::shutdown()::{lambda(boost::corosio::detail::win_local_stream_acceptor*)#1}>(boost::corosio::detail::win_local_stream_service::shutdown()::{lambda(boost::corosio::detail::win_local_stream_acceptor*)#1}&&)::{lambda(boost::corosio::detail::win_local_stream_acceptor*)#2}::operator()(boost::corosio::detail::win_local_stream_acceptor*) const
:303
2x
100.0%
–
100.0%
boost::corosio::detail::object_pool<boost::corosio::detail::win_local_stream_socket>::shutdown<boost::corosio::detail::win_local_stream_service::shutdown()::{lambda(boost::corosio::detail::win_local_stream_socket*)#1}>(boost::corosio::detail::win_local_stream_service::shutdown()::{lambda(boost::corosio::detail::win_local_stream_socket*)#1}&&)::{lambda(boost::corosio::detail::win_local_stream_socket*)#2}::operator()(boost::corosio::detail::win_local_stream_socket*) const
:303
7x
100.0%
–
100.0%
boost::corosio::detail::object_pool<boost::corosio::detail::win_object_handle_impl>::shutdown<boost::corosio::detail::win_object_handle_service::shutdown()::{lambda(boost::corosio::detail::win_object_handle_impl*)#1}>(boost::corosio::detail::win_object_handle_service::shutdown()::{lambda(boost::corosio::detail::win_object_handle_impl*)#1}&&)::{lambda(boost::corosio::detail::win_object_handle_impl*)#2}::operator()(boost::corosio::detail::win_object_handle_impl*) const
:303
1x
100.0%
–
100.0%
boost::corosio::detail::object_pool<boost::corosio::detail::win_random_access_file>::shutdown<boost::corosio::detail::win_random_access_file_service::shutdown()::{lambda(boost::corosio::detail::win_random_access_file*)#1}>(boost::corosio::detail::win_random_access_file_service::shutdown()::{lambda(boost::corosio::detail::win_random_access_file*)#1}&&)::{lambda(boost::corosio::detail::win_random_access_file*)#2}::operator()(boost::corosio::detail::win_random_access_file*) const
:303
1x
100.0%
–
100.0%
boost::corosio::detail::object_pool<boost::corosio::detail::win_random_access_handle_impl>::shutdown<boost::corosio::detail::win_random_access_handle_service::shutdown()::{lambda(boost::corosio::detail::win_random_access_handle_impl*)#1}>(boost::corosio::detail::win_random_access_handle_service::shutdown()::{lambda(boost::corosio::detail::win_random_access_handle_impl*)#1}&&)::{lambda(boost::corosio::detail::win_random_access_handle_impl*)#2}::operator()(boost::corosio::detail::win_random_access_handle_impl*) const
:303
2x
100.0%
–
100.0%
boost::corosio::detail::object_pool<boost::corosio::detail::win_resolver>::shutdown<boost::corosio::detail::win_resolver_service::shutdown()::{lambda(boost::corosio::detail::win_resolver*)#1}>(boost::corosio::detail::win_resolver_service::shutdown()::{lambda(boost::corosio::detail::win_resolver*)#1}&&)::{lambda(boost::corosio::detail::win_resolver*)#2}::operator()(boost::corosio::detail::win_resolver*) const
:303
7x
100.0%
–
100.0%
boost::corosio::detail::object_pool<boost::corosio::detail::win_signal>::shutdown<boost::corosio::detail::win_signals::shutdown()::{lambda(boost::corosio::detail::win_signal*)#1}>(boost::corosio::detail::win_signals::shutdown()::{lambda(boost::corosio::detail::win_signal*)#1}&&)::{lambda(boost::corosio::detail::win_signal*)#2}::operator()(boost::corosio::detail::win_signal*) const
:303
1605x
100.0%
–
100.0%
boost::corosio::detail::object_pool<boost::corosio::detail::win_stream_file>::shutdown<boost::corosio::detail::win_file_service::shutdown()::{lambda(boost::corosio::detail::win_stream_file*)#1}>(boost::corosio::detail::win_file_service::shutdown()::{lambda(boost::corosio::detail::win_stream_file*)#1}&&)::{lambda(boost::corosio::detail::win_stream_file*)#2}::operator()(boost::corosio::detail::win_stream_file*) const
:303
1x
100.0%
–
100.0%
boost::corosio::detail::object_pool<boost::corosio::detail::win_stream_handle_impl>::shutdown<boost::corosio::detail::win_stream_handle_service::shutdown()::{lambda(boost::corosio::detail::win_stream_handle_impl*)#1}>(boost::corosio::detail::win_stream_handle_service::shutdown()::{lambda(boost::corosio::detail::win_stream_handle_impl*)#1}&&)::{lambda(boost::corosio::detail::win_stream_handle_impl*)#2}::operator()(boost::corosio::detail::win_stream_handle_impl*) const
:303
4x
100.0%
–
100.0%
boost::corosio::detail::object_pool<boost::corosio::detail::win_tcp_acceptor>::shutdown<boost::corosio::detail::win_tcp_service::shutdown()::{lambda(boost::corosio::detail::win_tcp_acceptor*)#1}>(boost::corosio::detail::win_tcp_service::shutdown()::{lambda(boost::corosio::detail::win_tcp_acceptor*)#1}&&)::{lambda(boost::corosio::detail::win_tcp_acceptor*)#2}::operator()(boost::corosio::detail::win_tcp_acceptor*) const
:303
414x
100.0%
–
100.0%
boost::corosio::detail::object_pool<boost::corosio::detail::win_tcp_socket>::shutdown<boost::corosio::detail::win_tcp_service::shutdown()::{lambda(boost::corosio::detail::win_tcp_socket*)#1}>(boost::corosio::detail::win_tcp_service::shutdown()::{lambda(boost::corosio::detail::win_tcp_socket*)#1}&&)::{lambda(boost::corosio::detail::win_tcp_socket*)#2}::operator()(boost::corosio::detail::win_tcp_socket*) const
:303
1235x
100.0%
–
100.0%
boost::corosio::detail::object_pool<boost::corosio::detail::win_udp_socket>::shutdown<boost::corosio::detail::win_udp_service::shutdown()::{lambda(boost::corosio::detail::win_udp_socket*)#1}>(boost::corosio::detail::win_udp_service::shutdown()::{lambda(boost::corosio::detail::win_udp_socket*)#1}&&)::{lambda(boost::corosio::detail::win_udp_socket*)#2}::operator()(boost::corosio::detail::win_udp_socket*) const
:303
4x
100.0%
–
100.0%
| Line | Branch | TLA | Hits | Source Code |
|---|---|---|---|---|
| 1 | // | |||
| 2 | // Copyright (c) 2025 Steve Gerbino ([email protected]) | |||
| 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 | // Official repository: https://github.com/cppalliance/corosio | |||
| 8 | // | |||
| 9 | ||||
| 10 | #ifndef BOOST_COROSIO_DETAIL_OBJECT_POOL_HPP | |||
| 11 | #define BOOST_COROSIO_DETAIL_OBJECT_POOL_HPP | |||
| 12 | ||||
| 13 | #include <boost/corosio/detail/config.hpp> | |||
| 14 | #include <boost/corosio/detail/intrusive.hpp> | |||
| 15 | #include <boost/corosio/detail/object_ref.hpp> | |||
| 16 | #include <atomic> | |||
| 17 | #include <cstddef> | |||
| 18 | #include <initializer_list> | |||
| 19 | #include <limits> | |||
| 20 | #include <mutex> | |||
| 21 | #include <utility> | |||
| 22 | #include <vector> | |||
| 23 | ||||
| 24 | namespace boost::corosio::detail { | |||
| 25 | ||||
| 26 | /** Per-service recycling pool for I/O implementations. | |||
| 27 | ||||
| 28 | Replaces per-impl `shared_ptr` ownership: a service news an impl | |||
| 29 | once, then `recycle()` (the impl's `retire()` action) parks | |||
| 30 | it on the free list and `acquire()` hands it back out, so steady-state | |||
| 31 | construct/destroy allocates nothing. Unbounded; memory is released | |||
| 32 | only on pool destruction. Debug poisoning, where an impl does it, | |||
| 33 | happens in that impl's `retire()`, not here (the pool cannot know | |||
| 34 | which bytes are resettable). | |||
| 35 | ||||
| 36 | A service tears down its impls by calling `shutdown()`, which | |||
| 37 | enters shutting-down mode and visits every live impl in one | |||
| 38 | critical section; subsequent zero-ref crossings delete instead of | |||
| 39 | recycling. | |||
| 40 | ||||
| 41 | `adopt()` and `remove()` are protected ownership-transfer | |||
| 42 | primitives for sanctioned extensions — a derived pool exposing | |||
| 43 | them to a caller that tracks some of its live impls through its | |||
| 44 | own structure instead of this pool's `live_` list (the timer | |||
| 45 | service, via its expiry heap) — rather than part of the public | |||
| 46 | surface every ordinary service uses. | |||
| 47 | ||||
| 48 | @par Thread Safety | |||
| 49 | Distinct objects: Safe. Shared objects: Safe; all operations lock | |||
| 50 | an internal mutex. | |||
| 51 | */ | |||
| 52 | template<class Impl> | |||
| 53 | class object_pool | |||
| 54 | { | |||
| 55 | std::mutex mutex_; | |||
| 56 | intrusive_list<Impl> live_; | |||
| 57 | intrusive_list<Impl> free_; | |||
| 58 | bool shutting_down_ = false; | |||
| 59 | ||||
| 60 | /** Marks `refs_` on an impl currently parked in `free_`. | |||
| 61 | ||||
| 62 | `intrusive_list::remove()` cannot distinguish "linked in | |||
| 63 | `free_`" from "linked in `live_`" by inspecting the node | |||
| 64 | alone — both lists share one `next_`/`prev_` pair per impl — | |||
| 65 | so `recycle()` cannot safely call `live_.remove()` on an impl | |||
| 66 | it does not already know is live. Stamping this sentinel into | |||
| 67 | `refs_` the moment an impl joins `free_`, and checking it | |||
| 68 | before touching either list, is what lets `recycle()` and | |||
| 69 | `remove()` tell the two cases apart in every build mode, not | |||
| 70 | just under asserts. `acquire()` always overwrites it with 1 | |||
| 71 | before the impl is usable again. | |||
| 72 | */ | |||
| 73 | static constexpr std::size_t pooled_sentinel = pooled_refs; | |||
| 74 | ||||
| 75 | /// Check whether @p impl is parked in `free_` (`refs_` reads the | |||
| 76 | /// sentinel). Callers must check this before any list operation — | |||
| 77 | /// see the class-level comment on `pooled_sentinel`. | |||
| 78 | 38756x | static bool is_pooled(Impl const* impl) noexcept | ||
| 79 | { | |||
| 80 | 38756x | return impl->refs_.load(std::memory_order_relaxed) == | ||
| 81 | 38756x | pooled_sentinel; | ||
| 82 | } | |||
| 83 | ||||
| 84 | protected: | |||
| 85 | /** Track a fresh or reset impl as live. | |||
| 86 | ||||
| 87 | @pre @p impl is not parked in `free_` (`refs_` must not read | |||
| 88 | `pooled_sentinel`). The same list-corruption hazard | |||
| 89 | `recycle()`'s class-level comment documents applies here: a | |||
| 90 | free-listed impl pushed onto `live_` directly, bypassing | |||
| 91 | `acquire()`, would end up linked in both lists through one shared | |||
| 92 | `next_`/`prev_` pair. | |||
| 93 | ||||
| 94 | @pre The caller is not racing `shutdown()`. Every caller adopts | |||
| 95 | while constructing an object (`acquire()`, or a derived pool's | |||
| 96 | cache handing a parked impl back out), and construction is | |||
| 97 | expected to stop before the service's own `shutdown()` runs; | |||
| 98 | this is checked only in debug builds because the failure mode | |||
| 99 | is a silently orphaned impl (no close callback), not memory | |||
| 100 | corruption. | |||
| 101 | */ | |||
| 102 | 15682x | void adopt(Impl* impl) | ||
| 103 | { | |||
| 104 |
1/1✓ Branch 2 → 3 taken 15682 times.
|
15682x | std::lock_guard lock(mutex_); | |
| 105 |
1/2✗ Branch 4 → 5 not taken.
✓ Branch 4 → 6 taken 15682 times.
|
15682x | if (is_pooled(impl)) | |
| 106 | { | |||
| 107 | ✗ | BOOST_COROSIO_ASSERT(false); | ||
| 108 | return; | |||
| 109 | } | |||
| 110 |
1/2✗ Branch 6 → 7 not taken.
✓ Branch 6 → 8 taken 15682 times.
|
15682x | BOOST_COROSIO_ASSERT(!shutting_down_); | |
| 111 | 15682x | live_.push_back(impl); | ||
| 112 | 15682x | } | ||
| 113 | ||||
| 114 | /** Unlink a live impl without recycling (ownership transfer). | |||
| 115 | ||||
| 116 | Used by a caller that is taking an impl out of this pool's | |||
| 117 | bookkeeping entirely (a thread-local cache slot, a direct | |||
| 118 | delete during shutdown) rather than parking it on `free_`. | |||
| 119 | ||||
| 120 | @pre @p impl is not parked in `free_` (`refs_` must not read | |||
| 121 | `pooled_sentinel`). The same list-corruption hazard | |||
| 122 | `recycle()`'s class-level comment documents applies here: a | |||
| 123 | free-listed impl would be spliced out using `live_`'s | |||
| 124 | boundary pointers instead of `free_`'s. | |||
| 125 | ||||
| 126 | @return True if @p impl was linked in `live_` and has now | |||
| 127 | been removed; false if it was already detached. | |||
| 128 | */ | |||
| 129 | 5046x | bool remove(Impl* impl) noexcept | ||
| 130 | { | |||
| 131 | 5046x | std::lock_guard lock(mutex_); | ||
| 132 |
1/2✗ Branch 4 → 5 not taken.
✓ Branch 4 → 6 taken 5046 times.
|
5046x | if (is_pooled(impl)) | |
| 133 | { | |||
| 134 | ✗ | BOOST_COROSIO_ASSERT(false); | ||
| 135 | return false; | |||
| 136 | } | |||
| 137 | 5046x | return live_.remove(impl); | ||
| 138 | 5046x | } | ||
| 139 | ||||
| 140 | public: | |||
| 141 | /** Destroy the pool, freeing every impl still parked or live. | |||
| 142 | ||||
| 143 | A live impl is deleted whatever its count. Keepalives it holds | |||
| 144 | on itself (an embedded op's `object_ref`) are released by its | |||
| 145 | own destructor; the count is pinned first so none of those | |||
| 146 | releases reaches zero and calls `retire()` on an object that | |||
| 147 | is already being destroyed. | |||
| 148 | ||||
| 149 | @pre `shutdown()` has already run, or no impls are live. | |||
| 150 | */ | |||
| 151 | 6368x | ~object_pool() | ||
| 152 | { | |||
| 153 |
3/4✓ Branch 2 → 3 taken 10 times.
✓ Branch 2 → 6 taken 6358 times.
✗ Branch 4 → 5 not taken.
✓ Branch 4 → 6 taken 10 times.
|
6368x | BOOST_COROSIO_ASSERT(shutting_down_ || live_.empty()); | |
| 154 |
2/2✓ Branch 36 → 9 taken 12736 times.
✓ Branch 36 → 37 taken 6368 times.
|
19104x | for (auto* list : {&free_, &live_}) | |
| 155 | { | |||
| 156 |
2/2✓ Branch 11 → 12 taken 7350 times.
✓ Branch 11 → 35 taken 12736 times.
|
20086x | while (auto* impl = list->pop_front()) | |
| 157 | { | |||
| 158 | 7350x | impl->refs_.store(pooled_sentinel, std::memory_order_relaxed); | ||
| 159 |
1/2✓ Branch 32 → 33 taken 7350 times.
✗ Branch 32 → 34 not taken.
|
7350x | delete impl; | |
| 160 | } | |||
| 161 | } | |||
| 162 | 6368x | } | ||
| 163 | ||||
| 164 | 6368x | object_pool() = default; | ||
| 165 | object_pool(object_pool const&) = delete; | |||
| 166 | object_pool& operator=(object_pool const&) = delete; | |||
| 167 | ||||
| 168 | /** Pop-or-create an impl with the acquisition protocol applied. | |||
| 169 | ||||
| 170 | Recycled impls are `reuse()`-reset and their reference count | |||
| 171 | restored from the pooled sentinel; fresh impls are constructed | |||
| 172 | in place from `args` on the cold path. Either way the impl is | |||
| 173 | adopted as live. This is the sequence every service's | |||
| 174 | `construct()` used to hand-roll. Making the pool itself the | |||
| 175 | only place that calls `new Impl` gives the whole library one | |||
| 176 | audit point for allocation policy. | |||
| 177 | ||||
| 178 | @pre Not called concurrently with, or after, `shutdown()` on | |||
| 179 | this pool. Every caller reaches this through a service's | |||
| 180 | `construct()`, and service shutdown order guarantees no | |||
| 181 | `construct()` outlives that service's own `shutdown()`; the | |||
| 182 | window is only asserted in debug builds (see `adopt()`) | |||
| 183 | because the failure mode is an orphaned impl, not corruption. | |||
| 184 | ||||
| 185 | @param args Constructor arguments for `Impl` (cold path only). | |||
| 186 | ||||
| 187 | @return The acquired impl, `refs_ == 1`, tracked live. | |||
| 188 | */ | |||
| 189 | template<class... Args> | |||
| 190 | 19870x | Impl* acquire(Args&&... args) | ||
| 191 | { | |||
| 192 | Impl* impl; | |||
| 193 | { | |||
| 194 |
1/1✓ Branch 2 → 3 taken 19870 times.
|
19870x | std::lock_guard lock(mutex_); | |
| 195 |
1/2✗ Branch 3 → 4 not taken.
✓ Branch 3 → 5 taken 19870 times.
|
19870x | BOOST_COROSIO_ASSERT(!shutting_down_); | |
| 196 | 19870x | impl = free_.pop_front(); | ||
| 197 |
2/2✓ Branch 7 → 8 taken 7395 times.
✓ Branch 7 → 29 taken 12475 times.
|
19870x | if (impl) | |
| 198 | { | |||
| 199 | 7395x | impl->refs_.store(1, std::memory_order_relaxed); | ||
| 200 | 7395x | live_.push_back(impl); | ||
| 201 | } | |||
| 202 | 19870x | } | ||
| 203 | // reuse() runs unlocked: acquire()'s precondition excludes a | |||
| 204 | // concurrent shutdown() visiting the impl mid-reset. | |||
| 205 |
2/2✓ Branch 30 → 31 taken 7395 times.
✓ Branch 30 → 33 taken 12475 times.
|
19870x | if (impl) | |
| 206 | { | |||
| 207 | 7395x | impl->reuse(); | ||
| 208 | 7395x | return impl; | ||
| 209 | } | |||
| 210 | 12475x | impl = new Impl(std::forward<Args>(args)...); | ||
| 211 | 12475x | adopt(impl); | ||
| 212 | 12475x | return impl; | ||
| 213 | } | |||
| 214 | ||||
| 215 | /** Move a zero-ref impl from live to the free list. | |||
| 216 | ||||
| 217 | Called from `retire()`, possibly on a scheduler thread. | |||
| 218 | Deletes instead when shutting down. The impl must not be | |||
| 219 | touched after this returns. | |||
| 220 | ||||
| 221 | Two accounting bugs are possible here, neither from this | |||
| 222 | pool's own bookkeeping but from a caller's refcounting (e.g. | |||
| 223 | a duplicate `retire()` for one zero-crossing). Both are | |||
| 224 | made safe in every build mode, not just under asserts, because | |||
| 225 | neither can be told apart from the correct case by a | |||
| 226 | `BOOST_COROSIO_ASSERT` alone that still runs the list | |||
| 227 | operations around it: | |||
| 228 | ||||
| 229 | - `impl` is already parked in `free_` — the list-corruption | |||
| 230 | hazard the class-level `pooled_sentinel` comment documents. | |||
| 231 | The `is_pooled()` check runs first and returns before either | |||
| 232 | list is touched. | |||
| 233 | - `impl` is fully detached from `live_` and is not the | |||
| 234 | sentinel (not shutting down): `live_.remove()` correctly | |||
| 235 | returns false, but then the impl is reachable through | |||
| 236 | neither `acquire()` nor `shutdown()`'s visit while still | |||
| 237 | allocated — stranded. Deleted instead of left to leak. | |||
| 238 | ||||
| 239 | While shutting down, an impl that is no longer in `live_` is | |||
| 240 | left alone rather than deleted: something else already took | |||
| 241 | it out of the pool's bookkeeping (a derived pool's owner, or a | |||
| 242 | duplicate retirement of an impl already deleted), and deleting | |||
| 243 | it again here could be a double free. | |||
| 244 | */ | |||
| 245 | 18028x | void recycle(Impl* impl) | ||
| 246 | { | |||
| 247 | 18028x | bool do_delete = false; | ||
| 248 | { | |||
| 249 |
1/1✓ Branch 2 → 3 taken 18028 times.
|
18028x | std::lock_guard lock(mutex_); | |
| 250 |
1/2✗ Branch 4 → 5 not taken.
✓ Branch 4 → 6 taken 18028 times.
|
18028x | if (is_pooled(impl)) | |
| 251 | { | |||
| 252 | ✗ | BOOST_COROSIO_ASSERT(false); | ||
| 253 | return; | |||
| 254 | } | |||
| 255 | ||||
| 256 | 18028x | bool const was_live = live_.remove(impl); | ||
| 257 |
2/2✓ Branch 7 → 8 taken 3287 times.
✓ Branch 7 → 9 taken 14741 times.
|
18028x | if (shutting_down_) | |
| 258 | { | |||
| 259 | 3287x | do_delete = was_live; | ||
| 260 | } | |||
| 261 |
1/2✓ Branch 9 → 10 taken 14741 times.
✗ Branch 9 → 31 not taken.
|
14741x | else if (was_live) | |
| 262 | { | |||
| 263 | 14741x | impl->refs_.store( | ||
| 264 | pooled_sentinel, std::memory_order_relaxed); | |||
| 265 | // LIFO: the most recently retired impl is the | |||
| 266 | // cache-warmest candidate for the next acquire(). | |||
| 267 | 14741x | free_.push_front(impl); | ||
| 268 | } | |||
| 269 | else | |||
| 270 | { | |||
| 271 | ✗ | BOOST_COROSIO_ASSERT(false); | ||
| 272 | do_delete = true; | |||
| 273 | } | |||
| 274 | 18028x | } | ||
| 275 |
2/2✓ Branch 35 → 37 taken 3287 times.
✓ Branch 35 → 39 taken 14741 times.
|
18028x | if (do_delete) | |
| 276 |
1/2✓ Branch 37 → 38 taken 3287 times.
✗ Branch 37 → 39 not taken.
|
3287x | delete impl; | |
| 277 | } | |||
| 278 | ||||
| 279 | /** Enter shutdown mode and visit every live impl. | |||
| 280 | ||||
| 281 | Sets shutting-down (subsequent zero-crossings delete instead | |||
| 282 | of recycling) and runs `f` on each live impl, all under one | |||
| 283 | critical section. Each visited impl is pinned with a reference | |||
| 284 | for the call and released after the critical section ends, so | |||
| 285 | `f` may hold on to it; an impl whose count already reached zero | |||
| 286 | is retiring and is skipped rather than revived. | |||
| 287 | ||||
| 288 | @note The callback runs under the pool's non-recursive mutex; | |||
| 289 | it must not call recycle(), adopt(), or remove() on this pool. | |||
| 290 | */ | |||
| 291 | template<class F> | |||
| 292 | 6358x | void shutdown(F&& f) | ||
| 293 | { | |||
| 294 | 6358x | std::vector<Impl*> pinned; | ||
| 295 | { | |||
| 296 |
1/1✓ Branch 2 → 3 taken 6358 times.
|
6358x | std::lock_guard lock(mutex_); | |
| 297 | 6358x | shutting_down_ = true; | ||
| 298 | // Sized before any pin, so a failure here leaves none held. | |||
| 299 | 6358x | std::size_t n = 0; | ||
| 300 | 9647x | live_.for_each([&](Impl*) { ++n; }); | ||
| 301 |
1/1✓ Branch 4 → 5 taken 6358 times.
|
6358x | pinned.reserve(n); | |
| 302 |
1/1✓ Branch 5 → 6 taken 6358 times.
|
6358x | live_.for_each( | |
| 303 | 9872x | [&](Impl* impl) | ||
| 304 | { | |||
| 305 |
2/2✓ Branch 3 → 4 taken 4935 times.
✓ Branch 3 → 6 taken 1 time.
|
4936x | if (try_acquire(impl)) | |
| 306 | { | |||
| 307 | 4935x | pinned.push_back(impl); | ||
| 308 | 4935x | f(impl); | ||
| 309 | } | |||
| 310 | }); | |||
| 311 | 6358x | } | ||
| 312 |
2/2✓ Branch 13 → 9 taken 4935 times.
✓ Branch 13 → 14 taken 6358 times.
|
11293x | for (auto* impl : pinned) | |
| 313 | 4935x | release(impl); | ||
| 314 | 6358x | } | ||
| 315 | }; | |||
| 316 | ||||
| 317 | } // namespace boost::corosio::detail | |||
| 318 | ||||
| 319 | #endif | |||
| 320 |