mv LogTargetWrapper private, simplify set_target
This commit is contained in:
parent
71c49a692a
commit
130f5fb1ed
1 changed files with 101 additions and 134 deletions
133
common/log.h
133
common/log.h
|
@ -54,6 +54,43 @@
|
|||
inline void log_test();
|
||||
#endif
|
||||
|
||||
// Utility for synchronizing log configuration state
|
||||
// since std::optional was introduced only in c++17
|
||||
enum class LogTriState
|
||||
{
|
||||
Same,
|
||||
False,
|
||||
True
|
||||
};
|
||||
|
||||
enum class LogTargetChannel
|
||||
{
|
||||
Logfile,
|
||||
Screen
|
||||
};
|
||||
|
||||
class LogStateWrapper
|
||||
{
|
||||
protected:
|
||||
LogStateWrapper(){};
|
||||
|
||||
~LogStateWrapper()
|
||||
{
|
||||
log_flush_all_targets();
|
||||
for(auto t: _targets){delete t;}
|
||||
}
|
||||
|
||||
private:
|
||||
LogStateWrapper( LogStateWrapper& other ) = delete;
|
||||
void operator=( const LogStateWrapper& ) = delete;
|
||||
|
||||
private:
|
||||
static LogStateWrapper& instance()
|
||||
{
|
||||
static LogStateWrapper inst;
|
||||
return inst;
|
||||
}
|
||||
|
||||
class LogTargetWrapper
|
||||
{
|
||||
private:
|
||||
|
@ -139,45 +176,10 @@ class LogTargetWrapper
|
|||
std::string _filename;
|
||||
std::atomic<bool> _opened {false};
|
||||
std::atomic<FILE*> _handle {nullptr};
|
||||
|
||||
//friend class LogStateWrapper;
|
||||
};
|
||||
|
||||
// Utility for synchronizing log configuration state
|
||||
// since std::optional was introduced only in c++17
|
||||
enum class LogTriState
|
||||
{
|
||||
Same,
|
||||
False,
|
||||
True
|
||||
};
|
||||
|
||||
enum class LogTargetChannel
|
||||
{
|
||||
Logfile,
|
||||
Screen
|
||||
};
|
||||
|
||||
class LogStateWrapper
|
||||
{
|
||||
protected:
|
||||
LogStateWrapper(){};
|
||||
|
||||
virtual ~LogStateWrapper()
|
||||
{
|
||||
log_flush_all_targets();
|
||||
for(auto t: _targets){delete t;}
|
||||
}
|
||||
|
||||
private:
|
||||
LogStateWrapper( LogStateWrapper& other ) = delete;
|
||||
void operator=( const LogStateWrapper& ) = delete;
|
||||
|
||||
private:
|
||||
static LogStateWrapper& instance()
|
||||
{
|
||||
static LogStateWrapper inst;
|
||||
return inst;
|
||||
}
|
||||
|
||||
private:
|
||||
std::mutex _mutex;
|
||||
std::atomic_flag _lock = ATOMIC_FLAG_INIT;
|
||||
|
@ -191,53 +193,25 @@ class LogStateWrapper
|
|||
std::atomic<LogTargetWrapper*> _stored_target {&_null_target};
|
||||
|
||||
LogTargetWrapper* log_set_target_impl( const std::string && filename ) {return log_set_target_impl(filename);}
|
||||
LogTargetWrapper* log_set_target_impl( const std::string & filename ) {return log_add_select_target(new LogTargetWrapper(filename));}
|
||||
LogTargetWrapper* log_set_target_impl( FILE* handle ) {return log_add_select_target(new LogTargetWrapper(handle));}
|
||||
LogTargetWrapper* log_set_target_impl( LogTargetWrapper * target )
|
||||
LogTargetWrapper* log_set_target_impl( const std::string & filename ) {return log_add_select_target(new LogTargetWrapper(filename), true);}
|
||||
LogTargetWrapper* log_set_target_impl( FILE* handle ) {return log_add_select_target(new LogTargetWrapper(handle), true);}
|
||||
LogTargetWrapper* log_set_target_impl( LogTargetWrapper * target ) {return log_add_select_target(target);}
|
||||
|
||||
LogTargetWrapper* log_add_select_target(LogTargetWrapper* t, bool insert = false)
|
||||
{
|
||||
log_flush_all_targets();
|
||||
std::lock_guard<std::mutex> lock(_mutex);
|
||||
|
||||
if( _global_override_target == LogTriState::True)
|
||||
{
|
||||
if(_enabled || _global_override_enabled == LogTriState::True)
|
||||
return _current_target;
|
||||
if(_enabled || _global_override_enabled == LogTriState::True) return _current_target;
|
||||
return _stored_target;
|
||||
}
|
||||
|
||||
if(_enabled || _global_override_enabled == LogTriState::True)
|
||||
{
|
||||
_current_target.store(target);
|
||||
}
|
||||
else
|
||||
{
|
||||
_stored_target.store(target);
|
||||
}
|
||||
if(_enabled || _global_override_enabled == LogTriState::True) _current_target.store(t);
|
||||
else _stored_target.store(t);
|
||||
|
||||
return target;
|
||||
}
|
||||
|
||||
LogTargetWrapper* log_add_select_target(LogTargetWrapper* t)
|
||||
{
|
||||
log_flush_all_targets();
|
||||
std::lock_guard<std::mutex> lock(_mutex);
|
||||
|
||||
if( _global_override_target == LogTriState::True)
|
||||
{
|
||||
if(_enabled || _global_override_enabled == LogTriState::True)
|
||||
return _current_target;
|
||||
return _stored_target;
|
||||
}
|
||||
|
||||
if(_enabled || _global_override_enabled == LogTriState::True)
|
||||
{
|
||||
_current_target.store(t);
|
||||
}
|
||||
else
|
||||
{
|
||||
_stored_target.store(t);
|
||||
}
|
||||
_targets.insert(t);
|
||||
if(insert) _targets.insert(t);
|
||||
|
||||
return t;
|
||||
}
|
||||
|
@ -248,15 +222,8 @@ class LogStateWrapper
|
|||
for(auto t: _targets){ t->flush(); }
|
||||
}
|
||||
|
||||
FILE* log_handler_impl()
|
||||
{
|
||||
return *_current_target;
|
||||
}
|
||||
|
||||
FILE* log_tee_handler_impl()
|
||||
{
|
||||
return _stderr_target;
|
||||
}
|
||||
FILE* log_handler_impl() { return *_current_target; }
|
||||
FILE* log_tee_handler_impl() { return _stderr_target; }
|
||||
|
||||
void log_disable_impl( bool threadsafe = true )
|
||||
{
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue