Skip to content

Commit

Permalink
[core] Withdrawn changes from #2858 as they break ABI compat (#2899).
Browse files Browse the repository at this point in the history
  • Loading branch information
ethouris authored Mar 6, 2024
1 parent 12aad6e commit 710c202
Show file tree
Hide file tree
Showing 3 changed files with 35 additions and 83 deletions.
5 changes: 0 additions & 5 deletions srtcore/api.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -4656,29 +4656,25 @@ void setloglevel(LogLevel::type ll)
{
ScopedLock gg(srt_logger_config.mutex);
srt_logger_config.max_level = ll;
srt_logger_config.updateLoggersState();
}

void addlogfa(LogFA fa)
{
ScopedLock gg(srt_logger_config.mutex);
srt_logger_config.enabled_fa.set(fa, true);
srt_logger_config.updateLoggersState();
}

void dellogfa(LogFA fa)
{
ScopedLock gg(srt_logger_config.mutex);
srt_logger_config.enabled_fa.set(fa, false);
srt_logger_config.updateLoggersState();
}

void resetlogfa(set<LogFA> fas)
{
ScopedLock gg(srt_logger_config.mutex);
for (int i = 0; i <= SRT_LOGFA_LASTNONE; ++i)
srt_logger_config.enabled_fa.set(i, fas.count(i));
srt_logger_config.updateLoggersState();
}

void resetlogfa(const int* fara, size_t fara_size)
Expand All @@ -4687,7 +4683,6 @@ void resetlogfa(const int* fara, size_t fara_size)
srt_logger_config.enabled_fa.reset();
for (const int* i = fara; i != fara + fara_size; ++i)
srt_logger_config.enabled_fa.set(*i, true);
srt_logger_config.updateLoggersState();
}

void setlogstream(std::ostream& stream)
Expand Down
63 changes: 0 additions & 63 deletions srtcore/logging.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -23,69 +23,6 @@ using namespace std;
namespace srt_logging
{

// Note: subscribe() and unsubscribe() functions are being called
// in the global constructor and destructor only, as the
// Logger objects (and inside them also their LogDispatcher)
// are being created. It's not predicted that LogDispatcher
// object are going to be created any other way than as
// global objects. Therefore the construction and destruction
// of them happens always in the main thread.

void LogConfig::subscribe(LogDispatcher* lg)
{
vector<LogDispatcher*>::iterator p = std::find(loggers.begin(), loggers.end(), lg);
if (p != loggers.end())
return; // Do not register twice

loggers.push_back(lg);
}

void LogConfig::unsubscribe(LogDispatcher* lg)
{
vector<LogDispatcher*>::iterator p = std::find(loggers.begin(), loggers.end(), lg);
if (p != loggers.end())
{
loggers.erase(p);
}
}

// This function doesn't have any protection on itself,
// however the API functions from which it is called, call
// it already under a mutex protection.
void LogConfig::updateLoggersState()
{
for (vector<LogDispatcher*>::iterator p = loggers.begin();
p != loggers.end(); ++p)
{
(*p)->Update();
}
}

void LogDispatcher::Update()
{
bool enabled_in_fa = src_config->enabled_fa[fa];
enabled = enabled_in_fa && level <= src_config->max_level;
}


// SendLogLine can be compiled normally. It's intermediately used by:
// - Proxy object, which is replaced by DummyProxy when !ENABLE_LOGGING
// - PrintLogLine, which has empty body when !ENABLE_LOGGING
void LogDispatcher::SendLogLine(const char* file, int line, const std::string& area, const std::string& msg)
{
src_config->lock();
if ( src_config->loghandler_fn )
{
(*src_config->loghandler_fn)(src_config->loghandler_opaque, int(level), file, line, area.c_str(), msg.c_str());
}
else if ( src_config->log_stream )
{
(*src_config->log_stream) << msg;
src_config->log_stream->flush();
}
src_config->unlock();
}


#if ENABLE_LOGGING

Expand Down
50 changes: 35 additions & 15 deletions srtcore/logging.h
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,6 @@ written by
#include <iostream>
#include <iomanip>
#include <set>
#include <vector>
#include <sstream>
#include <cstdarg>
#ifdef _WIN32
Expand Down Expand Up @@ -116,7 +115,6 @@ struct LogConfig
void* loghandler_opaque;
srt::sync::Mutex mutex;
int flags;
std::vector<struct LogDispatcher*> loggers;

LogConfig(const fa_bitset_t& efa,
LogLevel::type l = LogLevel::warning,
Expand All @@ -139,10 +137,6 @@ struct LogConfig

SRT_ATTR_RELEASE(mutex)
void unlock() { mutex.unlock(); }

void subscribe(LogDispatcher*);
void unsubscribe(LogDispatcher*);
void updateLoggersState();
};

// The LogDispatcher class represents the object that is responsible for
Expand All @@ -154,7 +148,6 @@ struct SRT_API LogDispatcher
LogLevel::type level;
static const size_t MAX_PREFIX_SIZE = 32;
char prefix[MAX_PREFIX_SIZE+1];
srt::sync::atomic<bool> enabled;
LogConfig* src_config;

bool isset(int flg) { return (src_config->flags & flg) != 0; }
Expand All @@ -165,7 +158,6 @@ struct SRT_API LogDispatcher
const char* logger_pfx /*[[nullable]]*/, LogConfig& config):
fa(functional_area),
level(log_level),
enabled(false),
src_config(&config)
{
// XXX stpcpy desired, but not enough portable
Expand Down Expand Up @@ -193,18 +185,13 @@ struct SRT_API LogDispatcher
prefix[MAX_PREFIX_SIZE] = '\0';
#endif
}
config.subscribe(this);
Update();
}

~LogDispatcher()
{
src_config->unsubscribe(this);
}

void Update();

bool CheckEnabled() { return enabled; }
bool CheckEnabled();

void CreateLogLinePrefix(std::ostringstream&);
void SendLogLine(const char* file, int line, const std::string& area, const std::string& sl);
Expand Down Expand Up @@ -428,6 +415,22 @@ class Logger
}
};

inline bool LogDispatcher::CheckEnabled()
{
// Don't use enabler caching. Check enabled state every time.

// These assume to be atomically read, so the lock is not needed
// (note that writing to this field is still mutex-protected).
// It's also no problem if the level was changed at the moment
// when the enabler check is tested here. Worst case, the log
// will be printed just a moment after it was turned off.
const LogConfig* config = src_config; // to enforce using const operator[]
int configured_enabled_fa = config->enabled_fa[fa];
int configured_maxlevel = config->max_level;

return configured_enabled_fa && level <= configured_maxlevel;
}


#if HAVE_CXX11

Expand Down Expand Up @@ -478,7 +481,24 @@ inline void LogDispatcher::PrintLogLine(const char* file SRT_ATR_UNUSED, int lin

#endif // HAVE_CXX11

// SendLogLine can be compiled normally. It's intermediately used by:
// - Proxy object, which is replaced by DummyProxy when !ENABLE_LOGGING
// - PrintLogLine, which has empty body when !ENABLE_LOGGING
inline void LogDispatcher::SendLogLine(const char* file, int line, const std::string& area, const std::string& msg)
{
src_config->lock();
if ( src_config->loghandler_fn )
{
(*src_config->loghandler_fn)(src_config->loghandler_opaque, int(level), file, line, area.c_str(), msg.c_str());
}
else if ( src_config->log_stream )
{
(*src_config->log_stream) << msg;
(*src_config->log_stream).flush();
}
src_config->unlock();
}

#endif // INC_SRT_LOGGING_H
}

#endif // INC_SRT_LOGGING_H

0 comments on commit 710c202

Please sign in to comment.