18ers::LocalStream::instance()
30ers::LocalStream::LocalStream( )
31 : m_terminated( false )
34ers::LocalStream::~LocalStream( )
36 remove_issue_catcher();
40ers::LocalStream::remove_issue_catcher( )
42 std::unique_ptr<std::thread> catcher;
44 std::unique_lock lock( m_mutex );
45 if ( !m_issue_catcher_thread.get() )
50 m_condition.notify_one();
51 catcher.swap(m_issue_catcher_thread);
58ers::LocalStream::thread_wrapper()
60 std::unique_lock lock( m_mutex );
61 m_catcher_thread_id = std::this_thread::get_id();
62 while( !m_terminated )
64 m_condition.wait( lock, [
this](){
return !m_issues.empty() || m_terminated;} );
66 while( !m_terminated && !m_issues.empty() )
72 m_issue_catcher( *issue );
77 m_catcher_thread_id = {};
82ers::LocalStream::set_issue_catcher(
const std::function<
void (
const ers::Issue & )> & catcher )
84 std::unique_lock lock( m_mutex );
85 if ( m_issue_catcher_thread.get() )
87 throw ers::IssueCatcherAlreadySet(
ERS_HERE );
89 m_issue_catcher = catcher;
90 m_issue_catcher_thread.reset(
new std::thread( std::bind( &ers::LocalStream::thread_wrapper,
this ) ) );
98 if ( m_issue_catcher_thread.get() && m_catcher_thread_id != std::this_thread::get_id() )
102 std::unique_lock lock( m_mutex );
103 m_issues.push( clone );
104 m_condition.notify_one();
108 StreamManager::instance().report_issue( type, issue );
113ers::LocalStream::error(
const ers::Issue & issue )
119ers::LocalStream::fatal(
const ers::Issue & issue )
125ers::LocalStream::warning(
const ers::Issue & issue )
Implements issue catcher lifetime management.
Base class for any user define issue.
virtual Issue * clone() const =0
ers::Severity set_severity(ers::Severity severity) const