include/boost/corosio/detail/object_pool.hpp

93.0% Lines (53 / 57) 100.0% Functions (133 / 133)
object_pool.hpp
f(x) Functions (133)
Function Calls Lines Blocks
boost::corosio::detail::object_pool<boost::corosio::detail::(anonymous namespace)::pool_impl>::is_pooled(boost::corosio::detail::(anonymous namespace)::pool_impl const*) :77 15x 100.0% 68.0% boost::corosio::detail::object_pool<boost::corosio::detail::(anonymous namespace)::self_ref_impl>::is_pooled(boost::corosio::detail::(anonymous namespace)::self_ref_impl const*) :77 2x 100.0% 68.0% boost::corosio::detail::object_pool<boost::corosio::detail::epoll_local_datagram_socket>::is_pooled(boost::corosio::detail::epoll_local_datagram_socket const*) :77 312x 100.0% 68.0% boost::corosio::detail::object_pool<boost::corosio::detail::epoll_local_stream_acceptor>::is_pooled(boost::corosio::detail::epoll_local_stream_acceptor const*) :77 145x 100.0% 68.0% boost::corosio::detail::object_pool<boost::corosio::detail::epoll_local_stream_socket>::is_pooled(boost::corosio::detail::epoll_local_stream_socket const*) :77 383x 100.0% 68.0% boost::corosio::detail::object_pool<boost::corosio::detail::epoll_tcp_acceptor>::is_pooled(boost::corosio::detail::epoll_tcp_acceptor const*) :77 796x 100.0% 68.0% boost::corosio::detail::object_pool<boost::corosio::detail::epoll_tcp_socket>::is_pooled(boost::corosio::detail::epoll_tcp_socket const*) :77 9259x 100.0% 68.0% boost::corosio::detail::object_pool<boost::corosio::detail::epoll_udp_socket>::is_pooled(boost::corosio::detail::epoll_udp_socket const*) :77 365x 100.0% 68.0% boost::corosio::detail::object_pool<boost::corosio::detail::posix_random_access_file>::is_pooled(boost::corosio::detail::posix_random_access_file const*) :77 436x 100.0% 68.0% boost::corosio::detail::object_pool<boost::corosio::detail::posix_resolver>::is_pooled(boost::corosio::detail::posix_resolver const*) :77 199x 100.0% 68.0% boost::corosio::detail::object_pool<boost::corosio::detail::posix_signal>::is_pooled(boost::corosio::detail::posix_signal const*) :77 438x 100.0% 68.0% boost::corosio::detail::object_pool<boost::corosio::detail::posix_stream_file>::is_pooled(boost::corosio::detail::posix_stream_file const*) :77 612x 100.0% 68.0% boost::corosio::detail::object_pool<boost::corosio::detail::select_local_datagram_socket>::is_pooled(boost::corosio::detail::select_local_datagram_socket const*) :77 292x 100.0% 68.0% boost::corosio::detail::object_pool<boost::corosio::detail::select_local_stream_acceptor>::is_pooled(boost::corosio::detail::select_local_stream_acceptor const*) :77 138x 100.0% 68.0% boost::corosio::detail::object_pool<boost::corosio::detail::select_local_stream_socket>::is_pooled(boost::corosio::detail::select_local_stream_socket const*) :77 354x 100.0% 68.0% boost::corosio::detail::object_pool<boost::corosio::detail::select_tcp_acceptor>::is_pooled(boost::corosio::detail::select_tcp_acceptor const*) :77 639x 100.0% 68.0% boost::corosio::detail::object_pool<boost::corosio::detail::select_tcp_socket>::is_pooled(boost::corosio::detail::select_tcp_socket const*) :77 7409x 100.0% 68.0% boost::corosio::detail::object_pool<boost::corosio::detail::select_udp_socket>::is_pooled(boost::corosio::detail::select_udp_socket const*) :77 438x 100.0% 68.0% boost::corosio::detail::object_pool<boost::corosio::detail::timer::implementation>::is_pooled(boost::corosio::detail::timer::implementation const*) :77 34466x 100.0% 68.0% boost::corosio::detail::object_pool<boost::corosio::detail::(anonymous namespace)::pool_impl>::adopt(boost::corosio::detail::(anonymous namespace)::pool_impl*) :100 6x 85.7% 79.0% boost::corosio::detail::object_pool<boost::corosio::detail::(anonymous namespace)::self_ref_impl>::adopt(boost::corosio::detail::(anonymous namespace)::self_ref_impl*) :100 1x 85.7% 79.0% boost::corosio::detail::object_pool<boost::corosio::detail::epoll_local_datagram_socket>::adopt(boost::corosio::detail::epoll_local_datagram_socket*) :100 137x 85.7% 79.0% boost::corosio::detail::object_pool<boost::corosio::detail::epoll_local_stream_acceptor>::adopt(boost::corosio::detail::epoll_local_stream_acceptor*) :100 54x 85.7% 79.0% boost::corosio::detail::object_pool<boost::corosio::detail::epoll_local_stream_socket>::adopt(boost::corosio::detail::epoll_local_stream_socket*) :100 163x 85.7% 79.0% boost::corosio::detail::object_pool<boost::corosio::detail::epoll_tcp_acceptor>::adopt(boost::corosio::detail::epoll_tcp_acceptor*) :100 377x 85.7% 79.0% boost::corosio::detail::object_pool<boost::corosio::detail::epoll_tcp_socket>::adopt(boost::corosio::detail::epoll_tcp_socket*) :100 1037x 85.7% 79.0% boost::corosio::detail::object_pool<boost::corosio::detail::epoll_udp_socket>::adopt(boost::corosio::detail::epoll_udp_socket*) :100 165x 85.7% 79.0% boost::corosio::detail::object_pool<boost::corosio::detail::posix_random_access_file>::adopt(boost::corosio::detail::posix_random_access_file*) :100 219x 85.7% 79.0% boost::corosio::detail::object_pool<boost::corosio::detail::posix_resolver>::adopt(boost::corosio::detail::posix_resolver*) :100 68x 85.7% 79.0% boost::corosio::detail::object_pool<boost::corosio::detail::posix_signal>::adopt(boost::corosio::detail::posix_signal*) :100 186x 85.7% 79.0% boost::corosio::detail::object_pool<boost::corosio::detail::posix_stream_file>::adopt(boost::corosio::detail::posix_stream_file*) :100 275x 85.7% 79.0% boost::corosio::detail::object_pool<boost::corosio::detail::select_local_datagram_socket>::adopt(boost::corosio::detail::select_local_datagram_socket*) :100 128x 85.7% 79.0% boost::corosio::detail::object_pool<boost::corosio::detail::select_local_stream_acceptor>::adopt(boost::corosio::detail::select_local_stream_acceptor*) :100 51x 85.7% 79.0% boost::corosio::detail::object_pool<boost::corosio::detail::select_local_stream_socket>::adopt(boost::corosio::detail::select_local_stream_socket*) :100 153x 85.7% 79.0% boost::corosio::detail::object_pool<boost::corosio::detail::select_tcp_acceptor>::adopt(boost::corosio::detail::select_tcp_acceptor*) :100 298x 85.7% 79.0% boost::corosio::detail::object_pool<boost::corosio::detail::select_tcp_socket>::adopt(boost::corosio::detail::select_tcp_socket*) :100 780x 85.7% 79.0% boost::corosio::detail::object_pool<boost::corosio::detail::select_udp_socket>::adopt(boost::corosio::detail::select_udp_socket*) :100 202x 85.7% 79.0% boost::corosio::detail::object_pool<boost::corosio::detail::timer::implementation>::adopt(boost::corosio::detail::timer::implementation*) :100 17231x 85.7% 79.0% boost::corosio::detail::object_pool<boost::corosio::detail::(anonymous namespace)::pool_impl>::remove(boost::corosio::detail::(anonymous namespace)::pool_impl*) :127 3x 83.3% 88.0% boost::corosio::detail::object_pool<boost::corosio::detail::timer::implementation>::remove(boost::corosio::detail::timer::implementation*) :127 14844x 83.3% 88.0% boost::corosio::detail::object_pool<boost::corosio::detail::(anonymous namespace)::pool_impl>::~object_pool() :150 5x 100.0% 93.0% boost::corosio::detail::object_pool<boost::corosio::detail::(anonymous namespace)::self_ref_impl>::~object_pool() :150 1x 100.0% 80.0% boost::corosio::detail::object_pool<boost::corosio::detail::epoll_local_datagram_socket>::~object_pool() :150 82x 100.0% 80.0% boost::corosio::detail::object_pool<boost::corosio::detail::epoll_local_stream_acceptor>::~object_pool() :150 49x 100.0% 80.0% boost::corosio::detail::object_pool<boost::corosio::detail::epoll_local_stream_socket>::~object_pool() :150 108x 100.0% 80.0% boost::corosio::detail::object_pool<boost::corosio::detail::epoll_tcp_acceptor>::~object_pool() :150 359x 100.0% 80.0% boost::corosio::detail::object_pool<boost::corosio::detail::epoll_tcp_socket>::~object_pool() :150 435x 100.0% 80.0% boost::corosio::detail::object_pool<boost::corosio::detail::epoll_udp_socket>::~object_pool() :150 112x 100.0% 80.0% boost::corosio::detail::object_pool<boost::corosio::detail::posix_random_access_file>::~object_pool() :150 164x 100.0% 80.0% boost::corosio::detail::object_pool<boost::corosio::detail::posix_resolver>::~object_pool() :150 67x 100.0% 80.0% boost::corosio::detail::object_pool<boost::corosio::detail::posix_signal>::~object_pool() :150 167x 100.0% 80.0% boost::corosio::detail::object_pool<boost::corosio::detail::posix_stream_file>::~object_pool() :150 219x 100.0% 80.0% boost::corosio::detail::object_pool<boost::corosio::detail::select_local_datagram_socket>::~object_pool() :150 77x 100.0% 80.0% boost::corosio::detail::object_pool<boost::corosio::detail::select_local_stream_acceptor>::~object_pool() :150 46x 100.0% 80.0% boost::corosio::detail::object_pool<boost::corosio::detail::select_local_stream_socket>::~object_pool() :150 101x 100.0% 80.0% boost::corosio::detail::object_pool<boost::corosio::detail::select_tcp_acceptor>::~object_pool() :150 281x 100.0% 80.0% boost::corosio::detail::object_pool<boost::corosio::detail::select_tcp_socket>::~object_pool() :150 341x 100.0% 80.0% boost::corosio::detail::object_pool<boost::corosio::detail::select_udp_socket>::~object_pool() :150 151x 100.0% 80.0% boost::corosio::detail::object_pool<boost::corosio::detail::timer::implementation>::~object_pool() :150 2310x 100.0% 80.0% boost::corosio::detail::object_pool<boost::corosio::detail::epoll_local_datagram_socket>::object_pool() :158 82x 100.0% 100.0% boost::corosio::detail::object_pool<boost::corosio::detail::epoll_local_stream_acceptor>::object_pool() :158 49x 100.0% 100.0% boost::corosio::detail::object_pool<boost::corosio::detail::epoll_local_stream_socket>::object_pool() :158 108x 100.0% 100.0% boost::corosio::detail::object_pool<boost::corosio::detail::epoll_tcp_acceptor>::object_pool() :158 359x 100.0% 100.0% boost::corosio::detail::object_pool<boost::corosio::detail::epoll_tcp_socket>::object_pool() :158 435x 100.0% 100.0% boost::corosio::detail::object_pool<boost::corosio::detail::epoll_udp_socket>::object_pool() :158 112x 100.0% 100.0% boost::corosio::detail::object_pool<boost::corosio::detail::posix_random_access_file>::object_pool() :158 164x 100.0% 100.0% boost::corosio::detail::object_pool<boost::corosio::detail::posix_resolver>::object_pool() :158 67x 100.0% 100.0% boost::corosio::detail::object_pool<boost::corosio::detail::posix_signal>::object_pool() :158 167x 100.0% 100.0% boost::corosio::detail::object_pool<boost::corosio::detail::posix_stream_file>::object_pool() :158 219x 100.0% 100.0% boost::corosio::detail::object_pool<boost::corosio::detail::select_local_datagram_socket>::object_pool() :158 77x 100.0% 100.0% boost::corosio::detail::object_pool<boost::corosio::detail::select_local_stream_acceptor>::object_pool() :158 46x 100.0% 100.0% boost::corosio::detail::object_pool<boost::corosio::detail::select_local_stream_socket>::object_pool() :158 101x 100.0% 100.0% boost::corosio::detail::object_pool<boost::corosio::detail::select_tcp_acceptor>::object_pool() :158 281x 100.0% 100.0% boost::corosio::detail::object_pool<boost::corosio::detail::select_tcp_socket>::object_pool() :158 341x 100.0% 100.0% boost::corosio::detail::object_pool<boost::corosio::detail::select_udp_socket>::object_pool() :158 151x 100.0% 100.0% boost::corosio::detail::object_pool<boost::corosio::detail::timer::implementation>::object_pool() :158 2310x 100.0% 100.0% boost::corosio::detail::(anonymous namespace)::pool_impl* boost::corosio::detail::object_pool<boost::corosio::detail::(anonymous namespace)::pool_impl>::acquire<>() :184 8x 100.0% 74.0% boost::corosio::detail::(anonymous namespace)::self_ref_impl* boost::corosio::detail::object_pool<boost::corosio::detail::(anonymous namespace)::self_ref_impl>::acquire<>() :184 1x 71.4% 31.0% boost::corosio::detail::epoll_local_datagram_socket* boost::corosio::detail::object_pool<boost::corosio::detail::epoll_local_datagram_socket>::acquire<boost::corosio::detail::epoll_local_datagram_service&>(boost::corosio::detail::epoll_local_datagram_service&) :184 175x 100.0% 75.0% boost::corosio::detail::epoll_local_stream_acceptor* boost::corosio::detail::object_pool<boost::corosio::detail::epoll_local_stream_acceptor>::acquire<boost::corosio::detail::epoll_local_stream_acceptor_service&>(boost::corosio::detail::epoll_local_stream_acceptor_service&) :184 91x 100.0% 75.0% boost::corosio::detail::epoll_local_stream_socket* boost::corosio::detail::object_pool<boost::corosio::detail::epoll_local_stream_socket>::acquire<boost::corosio::detail::epoll_local_stream_service&>(boost::corosio::detail::epoll_local_stream_service&) :184 220x 100.0% 75.0% boost::corosio::detail::epoll_tcp_acceptor* boost::corosio::detail::object_pool<boost::corosio::detail::epoll_tcp_acceptor>::acquire<boost::corosio::detail::epoll_tcp_acceptor_service&>(boost::corosio::detail::epoll_tcp_acceptor_service&) :184 422x 100.0% 75.0% boost::corosio::detail::epoll_tcp_socket* boost::corosio::detail::object_pool<boost::corosio::detail::epoll_tcp_socket>::acquire<boost::corosio::detail::epoll_tcp_service&>(boost::corosio::detail::epoll_tcp_service&) :184 8225x 100.0% 75.0% boost::corosio::detail::epoll_udp_socket* boost::corosio::detail::object_pool<boost::corosio::detail::epoll_udp_socket>::acquire<boost::corosio::detail::epoll_udp_service&>(boost::corosio::detail::epoll_udp_service&) :184 200x 100.0% 75.0% boost::corosio::detail::posix_random_access_file* boost::corosio::detail::object_pool<boost::corosio::detail::posix_random_access_file>::acquire<boost::corosio::detail::posix_random_access_file_service&>(boost::corosio::detail::posix_random_access_file_service&) :184 219x 71.4% 32.0% boost::corosio::detail::posix_resolver* boost::corosio::detail::object_pool<boost::corosio::detail::posix_resolver>::acquire<boost::corosio::detail::posix_resolver_service&>(boost::corosio::detail::posix_resolver_service&) :184 132x 100.0% 75.0% boost::corosio::detail::posix_signal* boost::corosio::detail::object_pool<boost::corosio::detail::posix_signal>::acquire<boost::corosio::detail::posix_signal_service&>(boost::corosio::detail::posix_signal_service&) :184 258x 100.0% 75.0% boost::corosio::detail::posix_stream_file* boost::corosio::detail::object_pool<boost::corosio::detail::posix_stream_file>::acquire<boost::corosio::detail::posix_stream_file_service&>(boost::corosio::detail::posix_stream_file_service&) :184 339x 100.0% 75.0% boost::corosio::detail::select_local_datagram_socket* boost::corosio::detail::object_pool<boost::corosio::detail::select_local_datagram_socket>::acquire<boost::corosio::detail::select_local_datagram_service&>(boost::corosio::detail::select_local_datagram_service&) :184 164x 100.0% 75.0% boost::corosio::detail::select_local_stream_acceptor* boost::corosio::detail::object_pool<boost::corosio::detail::select_local_stream_acceptor>::acquire<boost::corosio::detail::select_local_stream_acceptor_service&>(boost::corosio::detail::select_local_stream_acceptor_service&) :184 87x 100.0% 75.0% boost::corosio::detail::select_local_stream_socket* boost::corosio::detail::object_pool<boost::corosio::detail::select_local_stream_socket>::acquire<boost::corosio::detail::select_local_stream_service&>(boost::corosio::detail::select_local_stream_service&) :184 201x 100.0% 75.0% boost::corosio::detail::select_tcp_acceptor* boost::corosio::detail::object_pool<boost::corosio::detail::select_tcp_acceptor>::acquire<boost::corosio::detail::select_tcp_acceptor_service&>(boost::corosio::detail::select_tcp_acceptor_service&) :184 343x 100.0% 75.0% boost::corosio::detail::select_tcp_socket* boost::corosio::detail::object_pool<boost::corosio::detail::select_tcp_socket>::acquire<boost::corosio::detail::select_tcp_service&>(boost::corosio::detail::select_tcp_service&) :184 6631x 100.0% 75.0% boost::corosio::detail::select_udp_socket* boost::corosio::detail::object_pool<boost::corosio::detail::select_udp_socket>::acquire<boost::corosio::detail::select_udp_service&>(boost::corosio::detail::select_udp_service&) :184 236x 100.0% 75.0% 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&) :184 2878x 100.0% 75.0% boost::corosio::detail::object_pool<boost::corosio::detail::(anonymous namespace)::pool_impl>::recycle(boost::corosio::detail::(anonymous namespace)::pool_impl*) :248 6x 86.7% 71.0% boost::corosio::detail::object_pool<boost::corosio::detail::(anonymous namespace)::self_ref_impl>::recycle(boost::corosio::detail::(anonymous namespace)::self_ref_impl*) :248 1x 60.0% 29.0% boost::corosio::detail::object_pool<boost::corosio::detail::epoll_local_datagram_socket>::recycle(boost::corosio::detail::epoll_local_datagram_socket*) :248 175x 86.7% 71.0% boost::corosio::detail::object_pool<boost::corosio::detail::epoll_local_stream_acceptor>::recycle(boost::corosio::detail::epoll_local_stream_acceptor*) :248 91x 86.7% 71.0% boost::corosio::detail::object_pool<boost::corosio::detail::epoll_local_stream_socket>::recycle(boost::corosio::detail::epoll_local_stream_socket*) :248 220x 86.7% 71.0% boost::corosio::detail::object_pool<boost::corosio::detail::epoll_tcp_acceptor>::recycle(boost::corosio::detail::epoll_tcp_acceptor*) :248 419x 86.7% 71.0% boost::corosio::detail::object_pool<boost::corosio::detail::epoll_tcp_socket>::recycle(boost::corosio::detail::epoll_tcp_socket*) :248 8222x 86.7% 71.0% boost::corosio::detail::object_pool<boost::corosio::detail::epoll_udp_socket>::recycle(boost::corosio::detail::epoll_udp_socket*) :248 200x 86.7% 71.0% boost::corosio::detail::object_pool<boost::corosio::detail::posix_random_access_file>::recycle(boost::corosio::detail::posix_random_access_file*) :248 217x 86.7% 71.0% boost::corosio::detail::object_pool<boost::corosio::detail::posix_resolver>::recycle(boost::corosio::detail::posix_resolver*) :248 131x 86.7% 71.0% boost::corosio::detail::object_pool<boost::corosio::detail::posix_signal>::recycle(boost::corosio::detail::posix_signal*) :248 252x 73.3% 64.0% boost::corosio::detail::object_pool<boost::corosio::detail::posix_stream_file>::recycle(boost::corosio::detail::posix_stream_file*) :248 337x 86.7% 71.0% boost::corosio::detail::object_pool<boost::corosio::detail::select_local_datagram_socket>::recycle(boost::corosio::detail::select_local_datagram_socket*) :248 164x 86.7% 71.0% boost::corosio::detail::object_pool<boost::corosio::detail::select_local_stream_acceptor>::recycle(boost::corosio::detail::select_local_stream_acceptor*) :248 87x 86.7% 71.0% boost::corosio::detail::object_pool<boost::corosio::detail::select_local_stream_socket>::recycle(boost::corosio::detail::select_local_stream_socket*) :248 201x 86.7% 71.0% boost::corosio::detail::object_pool<boost::corosio::detail::select_tcp_acceptor>::recycle(boost::corosio::detail::select_tcp_acceptor*) :248 341x 86.7% 71.0% boost::corosio::detail::object_pool<boost::corosio::detail::select_tcp_socket>::recycle(boost::corosio::detail::select_tcp_socket*) :248 6629x 86.7% 71.0% boost::corosio::detail::object_pool<boost::corosio::detail::select_udp_socket>::recycle(boost::corosio::detail::select_udp_socket*) :248 236x 86.7% 71.0% boost::corosio::detail::object_pool<boost::corosio::detail::timer::implementation>::recycle(boost::corosio::detail::timer::implementation*) :248 2391x 73.3% 64.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*)#1}>(boost::corosio::detail::object_pool_test::run()::{lambda(boost::corosio::detail::(anonymous namespace)::pool_impl*)#1}&&) :293 1x 100.0% 100.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}&&) :293 1x 100.0% 100.0% void boost::corosio::detail::object_pool<boost::corosio::detail::epoll_local_datagram_socket>::shutdown<boost::corosio::detail::reactor_socket_service<boost::corosio::detail::epoll_local_datagram_service, boost::corosio::detail::local_datagram_service, boost::corosio::detail::epoll_scheduler, boost::corosio::detail::epoll_local_datagram_socket>::shutdown()::{lambda(boost::corosio::detail::epoll_local_datagram_socket*)#1}>(boost::corosio::detail::reactor_socket_service<boost::corosio::detail::epoll_local_datagram_service, boost::corosio::detail::local_datagram_service, boost::corosio::detail::epoll_scheduler, boost::corosio::detail::epoll_local_datagram_socket>::shutdown()::{lambda(boost::corosio::detail::epoll_local_datagram_socket*)#1}&&) :293 82x 100.0% 100.0% void boost::corosio::detail::object_pool<boost::corosio::detail::epoll_local_stream_acceptor>::shutdown<boost::corosio::detail::reactor_acceptor_service<boost::corosio::detail::epoll_local_stream_acceptor_service, boost::corosio::detail::local_stream_acceptor_service, boost::corosio::detail::epoll_scheduler, boost::corosio::detail::epoll_local_stream_acceptor, boost::corosio::detail::epoll_local_stream_service>::shutdown()::{lambda(boost::corosio::detail::epoll_local_stream_acceptor*)#1}>(boost::corosio::detail::reactor_acceptor_service<boost::corosio::detail::epoll_local_stream_acceptor_service, boost::corosio::detail::local_stream_acceptor_service, boost::corosio::detail::epoll_scheduler, boost::corosio::detail::epoll_local_stream_acceptor, boost::corosio::detail::epoll_local_stream_service>::shutdown()::{lambda(boost::corosio::detail::epoll_local_stream_acceptor*)#1}&&) :293 49x 100.0% 100.0% void boost::corosio::detail::object_pool<boost::corosio::detail::epoll_local_stream_socket>::shutdown<boost::corosio::detail::reactor_socket_service<boost::corosio::detail::epoll_local_stream_service, boost::corosio::detail::local_stream_service, boost::corosio::detail::epoll_scheduler, boost::corosio::detail::epoll_local_stream_socket>::shutdown()::{lambda(boost::corosio::detail::epoll_local_stream_socket*)#1}>(boost::corosio::detail::reactor_socket_service<boost::corosio::detail::epoll_local_stream_service, boost::corosio::detail::local_stream_service, boost::corosio::detail::epoll_scheduler, boost::corosio::detail::epoll_local_stream_socket>::shutdown()::{lambda(boost::corosio::detail::epoll_local_stream_socket*)#1}&&) :293 108x 100.0% 100.0% void boost::corosio::detail::object_pool<boost::corosio::detail::epoll_tcp_acceptor>::shutdown<boost::corosio::detail::reactor_acceptor_service<boost::corosio::detail::epoll_tcp_acceptor_service, boost::corosio::detail::tcp_acceptor_service, boost::corosio::detail::epoll_scheduler, boost::corosio::detail::epoll_tcp_acceptor, boost::corosio::detail::epoll_tcp_service>::shutdown()::{lambda(boost::corosio::detail::epoll_tcp_acceptor*)#1}>(boost::corosio::detail::reactor_acceptor_service<boost::corosio::detail::epoll_tcp_acceptor_service, boost::corosio::detail::tcp_acceptor_service, boost::corosio::detail::epoll_scheduler, boost::corosio::detail::epoll_tcp_acceptor, boost::corosio::detail::epoll_tcp_service>::shutdown()::{lambda(boost::corosio::detail::epoll_tcp_acceptor*)#1}&&) :293 359x 100.0% 100.0% void boost::corosio::detail::object_pool<boost::corosio::detail::epoll_tcp_socket>::shutdown<boost::corosio::detail::reactor_socket_service<boost::corosio::detail::epoll_tcp_service, boost::corosio::detail::tcp_service, boost::corosio::detail::epoll_scheduler, boost::corosio::detail::epoll_tcp_socket>::shutdown()::{lambda(boost::corosio::detail::epoll_tcp_socket*)#1}>(boost::corosio::detail::reactor_socket_service<boost::corosio::detail::epoll_tcp_service, boost::corosio::detail::tcp_service, boost::corosio::detail::epoll_scheduler, boost::corosio::detail::epoll_tcp_socket>::shutdown()::{lambda(boost::corosio::detail::epoll_tcp_socket*)#1}&&) :293 435x 100.0% 100.0% void boost::corosio::detail::object_pool<boost::corosio::detail::epoll_udp_socket>::shutdown<boost::corosio::detail::reactor_socket_service<boost::corosio::detail::epoll_udp_service, boost::corosio::detail::udp_service, boost::corosio::detail::epoll_scheduler, boost::corosio::detail::epoll_udp_socket>::shutdown()::{lambda(boost::corosio::detail::epoll_udp_socket*)#1}>(boost::corosio::detail::reactor_socket_service<boost::corosio::detail::epoll_udp_service, boost::corosio::detail::udp_service, boost::corosio::detail::epoll_scheduler, boost::corosio::detail::epoll_udp_socket>::shutdown()::{lambda(boost::corosio::detail::epoll_udp_socket*)#1}&&) :293 112x 100.0% 100.0% void boost::corosio::detail::object_pool<boost::corosio::detail::posix_random_access_file>::shutdown<boost::corosio::detail::posix_random_access_file_service::shutdown()::{lambda(boost::corosio::detail::posix_random_access_file*)#1}>(boost::corosio::detail::posix_random_access_file_service::shutdown()::{lambda(boost::corosio::detail::posix_random_access_file*)#1}&&) :293 164x 100.0% 75.0% void boost::corosio::detail::object_pool<boost::corosio::detail::posix_resolver>::shutdown<boost::corosio::detail::posix_resolver_service::shutdown()::{lambda(boost::corosio::detail::posix_resolver*)#1}>(boost::corosio::detail::posix_resolver_service::shutdown()::{lambda(boost::corosio::detail::posix_resolver*)#1}&&) :293 67x 100.0% 75.0% void boost::corosio::detail::object_pool<boost::corosio::detail::posix_signal>::shutdown<boost::corosio::detail::posix_signal_service::shutdown()::{lambda(boost::corosio::detail::posix_signal*)#1}>(boost::corosio::detail::posix_signal_service::shutdown()::{lambda(boost::corosio::detail::posix_signal*)#1}&&) :293 167x 100.0% 75.0% void boost::corosio::detail::object_pool<boost::corosio::detail::posix_stream_file>::shutdown<boost::corosio::detail::posix_stream_file_service::shutdown()::{lambda(boost::corosio::detail::posix_stream_file*)#1}>(boost::corosio::detail::posix_stream_file_service::shutdown()::{lambda(boost::corosio::detail::posix_stream_file*)#1}&&) :293 219x 100.0% 75.0% void boost::corosio::detail::object_pool<boost::corosio::detail::select_local_datagram_socket>::shutdown<boost::corosio::detail::reactor_socket_service<boost::corosio::detail::select_local_datagram_service, boost::corosio::detail::local_datagram_service, boost::corosio::detail::select_scheduler, boost::corosio::detail::select_local_datagram_socket>::shutdown()::{lambda(boost::corosio::detail::select_local_datagram_socket*)#1}>(boost::corosio::detail::reactor_socket_service<boost::corosio::detail::select_local_datagram_service, boost::corosio::detail::local_datagram_service, boost::corosio::detail::select_scheduler, boost::corosio::detail::select_local_datagram_socket>::shutdown()::{lambda(boost::corosio::detail::select_local_datagram_socket*)#1}&&) :293 77x 100.0% 100.0% void boost::corosio::detail::object_pool<boost::corosio::detail::select_local_stream_acceptor>::shutdown<boost::corosio::detail::reactor_acceptor_service<boost::corosio::detail::select_local_stream_acceptor_service, boost::corosio::detail::local_stream_acceptor_service, boost::corosio::detail::select_scheduler, boost::corosio::detail::select_local_stream_acceptor, boost::corosio::detail::select_local_stream_service>::shutdown()::{lambda(boost::corosio::detail::select_local_stream_acceptor*)#1}>(boost::corosio::detail::reactor_acceptor_service<boost::corosio::detail::select_local_stream_acceptor_service, boost::corosio::detail::local_stream_acceptor_service, boost::corosio::detail::select_scheduler, boost::corosio::detail::select_local_stream_acceptor, boost::corosio::detail::select_local_stream_service>::shutdown()::{lambda(boost::corosio::detail::select_local_stream_acceptor*)#1}&&) :293 46x 100.0% 100.0% void boost::corosio::detail::object_pool<boost::corosio::detail::select_local_stream_socket>::shutdown<boost::corosio::detail::reactor_socket_service<boost::corosio::detail::select_local_stream_service, boost::corosio::detail::local_stream_service, boost::corosio::detail::select_scheduler, boost::corosio::detail::select_local_stream_socket>::shutdown()::{lambda(boost::corosio::detail::select_local_stream_socket*)#1}>(boost::corosio::detail::reactor_socket_service<boost::corosio::detail::select_local_stream_service, boost::corosio::detail::local_stream_service, boost::corosio::detail::select_scheduler, boost::corosio::detail::select_local_stream_socket>::shutdown()::{lambda(boost::corosio::detail::select_local_stream_socket*)#1}&&) :293 101x 100.0% 100.0% void boost::corosio::detail::object_pool<boost::corosio::detail::select_tcp_acceptor>::shutdown<boost::corosio::detail::reactor_acceptor_service<boost::corosio::detail::select_tcp_acceptor_service, boost::corosio::detail::tcp_acceptor_service, boost::corosio::detail::select_scheduler, boost::corosio::detail::select_tcp_acceptor, boost::corosio::detail::select_tcp_service>::shutdown()::{lambda(boost::corosio::detail::select_tcp_acceptor*)#1}>(boost::corosio::detail::reactor_acceptor_service<boost::corosio::detail::select_tcp_acceptor_service, boost::corosio::detail::tcp_acceptor_service, boost::corosio::detail::select_scheduler, boost::corosio::detail::select_tcp_acceptor, boost::corosio::detail::select_tcp_service>::shutdown()::{lambda(boost::corosio::detail::select_tcp_acceptor*)#1}&&) :293 281x 100.0% 100.0% void boost::corosio::detail::object_pool<boost::corosio::detail::select_tcp_socket>::shutdown<boost::corosio::detail::reactor_socket_service<boost::corosio::detail::select_tcp_service, boost::corosio::detail::tcp_service, boost::corosio::detail::select_scheduler, boost::corosio::detail::select_tcp_socket>::shutdown()::{lambda(boost::corosio::detail::select_tcp_socket*)#1}>(boost::corosio::detail::reactor_socket_service<boost::corosio::detail::select_tcp_service, boost::corosio::detail::tcp_service, boost::corosio::detail::select_scheduler, boost::corosio::detail::select_tcp_socket>::shutdown()::{lambda(boost::corosio::detail::select_tcp_socket*)#1}&&) :293 341x 100.0% 100.0% void boost::corosio::detail::object_pool<boost::corosio::detail::select_udp_socket>::shutdown<boost::corosio::detail::reactor_socket_service<boost::corosio::detail::select_udp_service, boost::corosio::detail::udp_service, boost::corosio::detail::select_scheduler, boost::corosio::detail::select_udp_socket>::shutdown()::{lambda(boost::corosio::detail::select_udp_socket*)#1}>(boost::corosio::detail::reactor_socket_service<boost::corosio::detail::select_udp_service, boost::corosio::detail::udp_service, boost::corosio::detail::select_scheduler, boost::corosio::detail::select_udp_socket>::shutdown()::{lambda(boost::corosio::detail::select_udp_socket*)#1}&&) :293 151x 100.0% 100.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}&&) :293 2310x 100.0% 100.0%
Line TLA Hits Source Code
1 //
2 // Copyright (c) 2025 Steve Gerbino (steve@gerbino.co)
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 <atomic>
16 #include <cstddef>
17 #include <initializer_list>
18 #include <limits>
19 #include <mutex>
20 #include <utility>
21
22 namespace boost::corosio::detail {
23
24 /** Per-service recycling pool for I/O implementations.
25
26 Replaces per-impl `shared_ptr` ownership: a service news an impl
27 once, then `recycle()` (the impl's `retire()` action) parks
28 it on the free list and `acquire()` hands it back out, so steady-state
29 construct/destroy allocates nothing. Unbounded; memory is released
30 only on pool destruction. In debug builds, recycled impls are
31 poisoned by the service's `reuse()` discipline, not here (the pool
32 cannot know which bytes are resettable).
33
34 A service tears down its impls by calling `shutdown()`, which
35 enters shutting-down mode and visits every live impl in one
36 critical section; subsequent zero-ref crossings delete instead of
37 recycling.
38
39 `adopt()` and `remove()` are protected ownership-transfer
40 primitives for sanctioned extensions — a derived pool exposing
41 them to a caller that tracks some of its live impls through its
42 own structure instead of this pool's `live_` list (the timer
43 service, via its expiry heap) — rather than part of the public
44 surface every ordinary service uses.
45
46 @par Thread Safety
47 Distinct objects: Safe. Shared objects: Safe; all operations lock
48 an internal mutex.
49 */
50 template<class Impl>
51 class object_pool
52 {
53 std::mutex mutex_;
54 intrusive_list<Impl> live_;
55 intrusive_list<Impl> free_;
56 bool shutting_down_ = false;
57
58 /** Marks `refs_` on an impl currently parked in `free_`.
59
60 `intrusive_list::remove()` cannot distinguish "linked in
61 `free_`" from "linked in `live_`" by inspecting the node
62 alone — both lists share one `next_`/`prev_` pair per impl —
63 so `recycle()` cannot safely call `live_.remove()` on an impl
64 it does not already know is live. Stamping this sentinel into
65 `refs_` the moment an impl joins `free_`, and checking it
66 before touching either list, is what lets `recycle()` and
67 `remove()` tell the two cases apart in every build mode, not
68 just under asserts. `acquire()` always overwrites it with 1
69 before the impl is usable again.
70 */
71 static constexpr std::size_t pooled_sentinel =
72 (std::numeric_limits<std::size_t>::max)();
73
74 /// Check whether @p impl is parked in `free_` (`refs_` reads the
75 /// sentinel). Callers must check this before any list operation —
76 /// see the class-level comment on `pooled_sentinel`.
77 56698x static bool is_pooled(Impl const* impl) noexcept
78 {
79 56698x return impl->refs_.load(std::memory_order_relaxed) ==
80 56698x pooled_sentinel;
81 }
82
83 protected:
84 /** Track a fresh or reset impl as live.
85
86 @pre @p impl is not parked in `free_` (`refs_` must not read
87 `pooled_sentinel`). The same list-corruption hazard
88 `recycle()`'s class-level comment documents applies here: a
89 free-listed impl pushed onto `live_` directly, bypassing
90 `acquire()`, would end up linked in both lists through one shared
91 `next_`/`prev_` pair.
92
93 @pre The caller is not racing `shutdown()`. `acquire()` is
94 this method's only caller, and a service's `construct()` —
95 `acquire()`'s only caller — is expected to stop being called
96 before the service's own `shutdown()` runs; this is checked
97 only in debug builds because the failure mode is a silently
98 orphaned impl (no close callback), not memory corruption.
99 */
100 21531x void adopt(Impl* impl)
101 {
102 21531x std::lock_guard lock(mutex_);
103 21531x if (is_pooled(impl))
104 {
105 ✗ BOOST_COROSIO_ASSERT(false);
106 return;
107 }
108 21531x BOOST_COROSIO_ASSERT(!shutting_down_);
109 21531x live_.push_back(impl);
110 21531x }
111
112 /** Unlink a live impl without recycling (ownership transfer).
113
114 Used by a caller that is taking an impl out of this pool's
115 bookkeeping entirely (a thread-local cache slot, a direct
116 delete during shutdown) rather than parking it on `free_`.
117
118 @pre @p impl is not parked in `free_` (`refs_` must not read
119 `pooled_sentinel`). The same list-corruption hazard
120 `recycle()`'s class-level comment documents applies here: a
121 free-listed impl would be spliced out using `live_`'s
122 boundary pointers instead of `free_`'s.
123
124 @return True if @p impl was linked in `live_` and has now
125 been removed; false if it was already detached.
126 */
127 14847x bool remove(Impl* impl) noexcept
128 {
129 14847x std::lock_guard lock(mutex_);
130 14847x if (is_pooled(impl))
131 {
132 ✗ BOOST_COROSIO_ASSERT(false);
133 return false;
134 }
135 14847x return live_.remove(impl);
136 14847x }
137
138 public:
139 /** Destroy the pool, freeing every impl still parked or live.
140
141 @pre `shutdown()` has already run, or no impls are live.
142 Without it, deleting a live impl here would let that impl's
143 own destructor reenter `recycle()` outside the shutting-down
144 branch that makes a reentrant retirement (a self-referential
145 op's `object_ref` releasing its last reference while this
146 destructor's own `delete` is still on the stack) a safe no-op
147 — it would instead look exactly like the accounting-bug case
148 `recycle()` deletes a second time.
149 */
150 5075x ~object_pool()
151 {
152 5075x BOOST_COROSIO_ASSERT(shutting_down_ || live_.empty());
153 15225x for (auto* list : {&free_, &live_})
154 16498x while (auto* impl = list->pop_front())
155 6348x delete impl;
156 5075x }
157
158 5069x object_pool() = default;
159 object_pool(object_pool const&) = delete;
160 object_pool& operator=(object_pool const&) = delete;
161
162 /** Pop-or-create an impl with the acquisition protocol applied.
163
164 Recycled impls are `reuse()`-reset and their reference count
165 restored from the pooled sentinel; fresh impls are constructed
166 in place from `args` on the cold path. Either way the impl is
167 adopted as live. This is the sequence every service's
168 `construct()` used to hand-roll. Making the pool itself the
169 only place that calls `new Impl` gives the whole library one
170 audit point for allocation policy.
171
172 @pre Not called concurrently with, or after, `shutdown()` on
173 this pool. Every caller reaches this through a service's
174 `construct()`, and service shutdown order guarantees no
175 `construct()` outlives that service's own `shutdown()`; the
176 window is only asserted in debug builds (see `adopt()`)
177 because the failure mode is an orphaned impl, not corruption.
178
179 @param args Constructor arguments for `Impl` (cold path only).
180
181 @return The acquired impl, `refs_ == 1`, tracked live.
182 */
183 template<class... Args>
184 20830x Impl* acquire(Args&&... args)
185 {
186 Impl* impl;
187 {
188 20830x std::lock_guard lock(mutex_);
189 20830x BOOST_COROSIO_ASSERT(!shutting_down_);
190 20830x impl = free_.pop_front();
191 20830x if (impl)
192 {
193 13656x impl->refs_.store(1, std::memory_order_relaxed);
194 13656x live_.push_back(impl);
195 }
196 20830x }
197 // reuse() runs unlocked: acquire()'s precondition excludes a
198 // concurrent shutdown() visiting the impl mid-reset.
199 20830x if (impl)
200 {
201 13656x impl->reuse();
202 13656x return impl;
203 }
204 7174x impl = new Impl(std::forward<Args>(args)...);
205 7174x adopt(impl);
206 7174x return impl;
207 }
208
209 /** Move a zero-ref impl from live to the free list.
210
211 Called from `retire()`, possibly on a scheduler thread.
212 Deletes instead when shutting down. The impl must not be
213 touched after this returns.
214
215 Two accounting bugs are possible here, neither from this
216 pool's own bookkeeping but from a caller's refcounting (e.g.
217 a duplicate `retire()` for one zero-crossing). Both are
218 made safe in every build mode, not just under asserts, because
219 neither can be told apart from the correct case by a
220 `BOOST_COROSIO_ASSERT` alone that still runs the list
221 operations around it:
222
223 - `impl` is already parked in `free_` — the list-corruption
224 hazard the class-level `pooled_sentinel` comment documents.
225 The `is_pooled()` check runs first and returns before either
226 list is touched.
227 - `impl` is fully detached from `live_` and is not the
228 sentinel (not shutting down): `live_.remove()` correctly
229 returns false, but then the impl is reachable through
230 neither `acquire()` nor `shutdown()`'s visit while still
231 allocated — stranded. Deleted instead of left to leak.
232
233 The one legitimate "already detached" case — an impl with an
234 embedded op whose `object_ref` points back at itself reaching
235 zero *during* `delete impl`, e.g. `~object_pool()`'s own
236 unconditional sweep tearing down that op's `object_ref` member
237 before the outer `delete` returns — is distinguished from the
238 accounting-bug case by `shutting_down_`: that reentrant path
239 only exists because `shutdown()` — called with a no-op
240 callback by a caller like the timer service that tracks its
241 live impls through its own structure instead of this pool's
242 `live_` list, just to flip the flag — always precedes
243 `~object_pool()`'s sweep (service shutdown order), so a
244 not-live, not-pooled impl while `shutting_down_` is exactly
245 that reentrant no-op, and the (already false) `was_live` means
246 skip the delete — the outer frame's `delete` is still running.
247 */
248 20320x void recycle(Impl* impl)
249 {
250 20320x bool do_delete = false;
251 {
252 20320x std::lock_guard lock(mutex_);
253 20320x if (is_pooled(impl))
254 {
255 ✗ BOOST_COROSIO_ASSERT(false);
256 return;
257 }
258
259 20320x bool const was_live = live_.remove(impl);
260 20320x if (shutting_down_)
261 {
262 338x do_delete = was_live;
263 }
264 19982x else if (was_live)
265 {
266 19982x impl->refs_.store(
267 pooled_sentinel, std::memory_order_relaxed);
268 // LIFO: the most recently retired impl is the
269 // cache-warmest candidate for the next acquire().
270 19982x free_.push_front(impl);
271 }
272 else
273 {
274 ✗ BOOST_COROSIO_ASSERT(false);
275 do_delete = true;
276 }
277 20320x }
278 20320x if (do_delete)
279 337x delete impl;
280 }
281
282 /** Enter shutdown mode and visit every live impl.
283
284 Sets shutting-down (subsequent zero-crossings delete instead
285 of recycling) and runs `f` on each live impl, all under one
286 critical section.
287
288 @note The callback runs under the pool's non-recursive mutex;
289 it must not call acquire(), recycle(), adopt(), or remove()
290 on this pool.
291 */
292 template<class F>
293 5071x void shutdown(F&& f)
294 {
295 5071x std::lock_guard lock(mutex_);
296 5071x shutting_down_ = true;
297 5071x live_.for_each(std::forward<F>(f));
298 5071x }
299 };
300
301 } // namespace boost::corosio::detail
302
303 #endif
304