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,8 +54,45 @@
inline void log_test();
#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:
LogTargetWrapper( LogTargetWrapper& other ) = delete;
void operator=( const LogTargetWrapper& ) = delete;
@ -139,44 +176,9 @@ class LogTargetWrapper
std::string _filename;
std::atomic<bool> _opened {false};
std::atomic<FILE*> _handle {nullptr};
};
// 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;
}
//friend class LogStateWrapper;
};
private:
std::mutex _mutex;
@ -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 )
{
log_flush_all_targets();
std::lock_guard<std::mutex> lock(_mutex);
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);}
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(target);
}
else
{
_stored_target.store(target);
}
return target;
}
LogTargetWrapper* log_add_select_target(LogTargetWrapper* t)
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(t);
}
else
{
_stored_target.store(t);
}
_targets.insert(t);
if(_enabled || _global_override_enabled == LogTriState::True) _current_target.store(t);
else _stored_target.store(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 )
{