mv LogTargetWrapper private, simplify set_target
This commit is contained in:
parent
71c49a692a
commit
130f5fb1ed
1 changed files with 101 additions and 134 deletions
135
common/log.h
135
common/log.h
|
@ -54,8 +54,45 @@
|
||||||
inline void log_test();
|
inline void log_test();
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
class LogTargetWrapper
|
// 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:
|
private:
|
||||||
LogTargetWrapper( LogTargetWrapper& other ) = delete;
|
LogTargetWrapper( LogTargetWrapper& other ) = delete;
|
||||||
void operator=( const LogTargetWrapper& ) = delete;
|
void operator=( const LogTargetWrapper& ) = delete;
|
||||||
|
@ -139,44 +176,9 @@ class LogTargetWrapper
|
||||||
std::string _filename;
|
std::string _filename;
|
||||||
std::atomic<bool> _opened {false};
|
std::atomic<bool> _opened {false};
|
||||||
std::atomic<FILE*> _handle {nullptr};
|
std::atomic<FILE*> _handle {nullptr};
|
||||||
};
|
|
||||||
|
|
||||||
// Utility for synchronizing log configuration state
|
//friend class LogStateWrapper;
|
||||||
// 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:
|
private:
|
||||||
std::mutex _mutex;
|
std::mutex _mutex;
|
||||||
|
@ -191,53 +193,25 @@ class LogStateWrapper
|
||||||
std::atomic<LogTargetWrapper*> _stored_target {&_null_target};
|
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_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( 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));}
|
LogTargetWrapper* log_set_target_impl( FILE* handle ) {return log_add_select_target(new LogTargetWrapper(handle), true);}
|
||||||
LogTargetWrapper* log_set_target_impl( LogTargetWrapper * target )
|
LogTargetWrapper* log_set_target_impl( LogTargetWrapper * target ) {return log_add_select_target(target);}
|
||||||
{
|
|
||||||
log_flush_all_targets();
|
|
||||||
std::lock_guard<std::mutex> lock(_mutex);
|
|
||||||
|
|
||||||
if( _global_override_target == LogTriState::True )
|
LogTargetWrapper* log_add_select_target(LogTargetWrapper* t, bool insert = false)
|
||||||
{
|
|
||||||
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);
|
|
||||||
}
|
|
||||||
|
|
||||||
return target;
|
|
||||||
}
|
|
||||||
|
|
||||||
LogTargetWrapper* log_add_select_target(LogTargetWrapper* t)
|
|
||||||
{
|
{
|
||||||
log_flush_all_targets();
|
log_flush_all_targets();
|
||||||
std::lock_guard<std::mutex> lock(_mutex);
|
std::lock_guard<std::mutex> lock(_mutex);
|
||||||
|
|
||||||
if( _global_override_target == LogTriState::True)
|
if( _global_override_target == LogTriState::True)
|
||||||
{
|
{
|
||||||
if(_enabled || _global_override_enabled == LogTriState::True)
|
if(_enabled || _global_override_enabled == LogTriState::True) return _current_target;
|
||||||
return _current_target;
|
|
||||||
return _stored_target;
|
return _stored_target;
|
||||||
}
|
}
|
||||||
|
|
||||||
if(_enabled || _global_override_enabled == LogTriState::True)
|
if(_enabled || _global_override_enabled == LogTriState::True) _current_target.store(t);
|
||||||
{
|
else _stored_target.store(t);
|
||||||
_current_target.store(t);
|
|
||||||
}
|
if(insert) _targets.insert(t);
|
||||||
else
|
|
||||||
{
|
|
||||||
_stored_target.store(t);
|
|
||||||
}
|
|
||||||
_targets.insert(t);
|
|
||||||
|
|
||||||
return t;
|
return t;
|
||||||
}
|
}
|
||||||
|
@ -248,15 +222,8 @@ class LogStateWrapper
|
||||||
for(auto t: _targets){ t->flush(); }
|
for(auto t: _targets){ t->flush(); }
|
||||||
}
|
}
|
||||||
|
|
||||||
FILE* log_handler_impl()
|
FILE* log_handler_impl() { return *_current_target; }
|
||||||
{
|
FILE* log_tee_handler_impl() { return _stderr_target; }
|
||||||
return *_current_target;
|
|
||||||
}
|
|
||||||
|
|
||||||
FILE* log_tee_handler_impl()
|
|
||||||
{
|
|
||||||
return _stderr_target;
|
|
||||||
}
|
|
||||||
|
|
||||||
void log_disable_impl( bool threadsafe = true )
|
void log_disable_impl( bool threadsafe = true )
|
||||||
{
|
{
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue