diff --git a/include/fc/interprocess/signals.hpp b/include/fc/interprocess/signals.hpp index 876c684..dd791d1 100644 --- a/include/fc/interprocess/signals.hpp +++ b/include/fc/interprocess/signals.hpp @@ -1,8 +1,11 @@ #pragma once #include +#include namespace fc { - /// handler will be called from ASIO thread - void set_signal_handler( std::function handler, int signal_num ); + /// Set a handler to process an IPC (inter process communication) signal. + /// Handler will be called from ASIO thread. + /// @return shared pointer to the signal_set that holds the handler + std::shared_ptr set_signal_handler( std::function handler, int signal_num ); } diff --git a/src/interprocess/signals.cpp b/src/interprocess/signals.cpp index f65f122..2a4652c 100644 --- a/src/interprocess/signals.cpp +++ b/src/interprocess/signals.cpp @@ -3,15 +3,16 @@ namespace fc { - void set_signal_handler( std::function handler, int signal_num ) - { - std::shared_ptr sig_set(new boost::asio::signal_set(fc::asio::default_io_service(), signal_num)); - sig_set->async_wait( - [sig_set,handler]( const boost::system::error_code& err, int num ) - { - handler( num ); - sig_set->cancel(); - // set_signal_handler( handler, signal_num ); - } ); - } + std::shared_ptr set_signal_handler( std::function handler, int signal_num ) + { + std::shared_ptr sig_set( new boost::asio::signal_set( fc::asio::default_io_service(), + signal_num) ); + sig_set->async_wait( [sig_set,handler]( const boost::system::error_code& err, int num ) + { + if( err != boost::asio::error::operation_aborted ) + handler( num ); + sig_set->cancel(); + } ); + return sig_set; + } }