mv LogTargetWrapper private, simplify set_target

This commit is contained in:
staviq 2023-09-16 19:12:20 +02:00
parent 71c49a692a
commit 130f5fb1ed

View file

@ -54,6 +54,43 @@
inline void log_test(); inline void log_test();
#endif #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 class LogTargetWrapper
{ {
private: private:
@ -139,45 +176,10 @@ 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};
//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: private:
std::mutex _mutex; std::mutex _mutex;
std::atomic_flag _lock = ATOMIC_FLAG_INIT; std::atomic_flag _lock = ATOMIC_FLAG_INIT;
@ -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);}
LogTargetWrapper* log_add_select_target(LogTargetWrapper* t, bool insert = false)
{ {
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(target);
}
else
{
_stored_target.store(target);
}
return target; if(insert) _targets.insert(t);
}
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);
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 )
{ {