From d9b5769c1339bf26b5b22f920149aa0e9dd78086 Mon Sep 17 00:00:00 2001 From: Daniel Larimer Date: Tue, 6 Aug 2013 12:46:04 -0400 Subject: [PATCH] cleanup the asio thread gracefully on exit --- src/asio.cpp | 45 +++++++++++++++++++++++++++++---------------- 1 file changed, 29 insertions(+), 16 deletions(-) diff --git a/src/asio.cpp b/src/asio.cpp index 9a52288..33333e7 100644 --- a/src/asio.cpp +++ b/src/asio.cpp @@ -84,23 +84,36 @@ namespace fc { } } } - boost::asio::io_service& default_io_service(bool cleanup) { - static boost::asio::io_service io; - static boost::asio::io_service::work the_work(io); - static boost::thread io_t([=] - { - try { - fc::thread::current().set_name("asio"); - io.run(); - } - catch(...) - { - elog( "unexpected asio exception" ); - } - } - ); - return io; + struct default_io_service_scope + { + boost::asio::io_service* io; + boost::thread* asio_thread; + boost::asio::io_service::work* the_work; + + default_io_service_scope() + { + io = new boost::asio::io_service(); + the_work = new boost::asio::io_service::work(*io); + asio_thread = new boost::thread( [=]() + { + fc::thread::current().set_name("asio"); + io->run(); + }); + } + + ~default_io_service_scope() + { + delete the_work; + io->stop(); + asio_thread->join(); + delete io; + delete asio_thread; + } + }; + boost::asio::io_service& default_io_service(bool cleanup) { + static default_io_service_scope fc_asio_service; + return *fc_asio_service.io; } namespace tcp {