mirror of https://github.com/AxioDL/logvisor.git
Recursive mutex for avoidng deadlocks during logging
This commit is contained in:
parent
c839ce774c
commit
9285d183d7
|
@ -87,13 +87,14 @@ extern std::atomic_uint_fast64_t FrameIndex;
|
||||||
*
|
*
|
||||||
* Ensures logging streams aren't written concurrently
|
* Ensures logging streams aren't written concurrently
|
||||||
*/
|
*/
|
||||||
extern std::mutex LogMutex;
|
extern std::recursive_mutex LogMutex;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief Take a centralized lock for the logging output stream(s)
|
* @brief Take a centralized lock for the logging output stream(s)
|
||||||
* @return RAII mutex lock
|
* @return RAII mutex lock
|
||||||
*/
|
*/
|
||||||
static inline std::unique_lock<std::mutex> LockLog() {return std::unique_lock<std::mutex>{LogMutex};}
|
static inline std::unique_lock<std::recursive_mutex> LockLog()
|
||||||
|
{return std::unique_lock<std::recursive_mutex>{LogMutex};}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief Restore centralized logger vector to default state (silent operation)
|
* @brief Restore centralized logger vector to default state (silent operation)
|
||||||
|
|
|
@ -157,7 +157,7 @@ static std::chrono::steady_clock::time_point GlobalStart = MonoClock.now();
|
||||||
static inline std::chrono::steady_clock::duration CurrentUptime()
|
static inline std::chrono::steady_clock::duration CurrentUptime()
|
||||||
{return MonoClock.now() - GlobalStart;}
|
{return MonoClock.now() - GlobalStart;}
|
||||||
std::atomic_uint_fast64_t FrameIndex(0);
|
std::atomic_uint_fast64_t FrameIndex(0);
|
||||||
std::mutex LogMutex;
|
std::recursive_mutex LogMutex;
|
||||||
|
|
||||||
static inline int ConsoleWidth()
|
static inline int ConsoleWidth()
|
||||||
{
|
{
|
||||||
|
@ -184,7 +184,6 @@ static const char* Term = nullptr;
|
||||||
bool XtermColor = false;
|
bool XtermColor = false;
|
||||||
struct ConsoleLogger : public ILogger
|
struct ConsoleLogger : public ILogger
|
||||||
{
|
{
|
||||||
std::mutex m;
|
|
||||||
ConsoleLogger()
|
ConsoleLogger()
|
||||||
{
|
{
|
||||||
#if _WIN32
|
#if _WIN32
|
||||||
|
@ -333,7 +332,6 @@ struct ConsoleLogger : public ILogger
|
||||||
void report(const char* modName, Level severity,
|
void report(const char* modName, Level severity,
|
||||||
const char* format, va_list ap)
|
const char* format, va_list ap)
|
||||||
{
|
{
|
||||||
std::unique_lock<std::mutex> lk(m);
|
|
||||||
_reportHead(modName, nullptr, severity);
|
_reportHead(modName, nullptr, severity);
|
||||||
vfprintf(stderr, format, ap);
|
vfprintf(stderr, format, ap);
|
||||||
fprintf(stderr, "\n");
|
fprintf(stderr, "\n");
|
||||||
|
@ -342,7 +340,6 @@ struct ConsoleLogger : public ILogger
|
||||||
void report(const char* modName, Level severity,
|
void report(const char* modName, Level severity,
|
||||||
const wchar_t* format, va_list ap)
|
const wchar_t* format, va_list ap)
|
||||||
{
|
{
|
||||||
std::unique_lock<std::mutex> lk(m);
|
|
||||||
_reportHead(modName, nullptr, severity);
|
_reportHead(modName, nullptr, severity);
|
||||||
vfwprintf(stderr, format, ap);
|
vfwprintf(stderr, format, ap);
|
||||||
fprintf(stderr, "\n");
|
fprintf(stderr, "\n");
|
||||||
|
@ -352,7 +349,6 @@ struct ConsoleLogger : public ILogger
|
||||||
const char* file, unsigned linenum,
|
const char* file, unsigned linenum,
|
||||||
const char* format, va_list ap)
|
const char* format, va_list ap)
|
||||||
{
|
{
|
||||||
std::unique_lock<std::mutex> lk(m);
|
|
||||||
char sourceInfo[128];
|
char sourceInfo[128];
|
||||||
snprintf(sourceInfo, 128, "%s:%u", file, linenum);
|
snprintf(sourceInfo, 128, "%s:%u", file, linenum);
|
||||||
_reportHead(modName, sourceInfo, severity);
|
_reportHead(modName, sourceInfo, severity);
|
||||||
|
@ -364,7 +360,6 @@ struct ConsoleLogger : public ILogger
|
||||||
const char* file, unsigned linenum,
|
const char* file, unsigned linenum,
|
||||||
const wchar_t* format, va_list ap)
|
const wchar_t* format, va_list ap)
|
||||||
{
|
{
|
||||||
std::unique_lock<std::mutex> lk(m);
|
|
||||||
char sourceInfo[128];
|
char sourceInfo[128];
|
||||||
snprintf(sourceInfo, 128, "%s:%u", file, linenum);
|
snprintf(sourceInfo, 128, "%s:%u", file, linenum);
|
||||||
_reportHead(modName, sourceInfo, severity);
|
_reportHead(modName, sourceInfo, severity);
|
||||||
|
@ -408,7 +403,6 @@ void RegisterStandardExceptions()
|
||||||
struct FileLogger : public ILogger
|
struct FileLogger : public ILogger
|
||||||
{
|
{
|
||||||
FILE* fp;
|
FILE* fp;
|
||||||
std::mutex m;
|
|
||||||
virtual void openFile()=0;
|
virtual void openFile()=0;
|
||||||
virtual void closeFile() {fclose(fp);}
|
virtual void closeFile() {fclose(fp);}
|
||||||
|
|
||||||
|
@ -456,7 +450,6 @@ struct FileLogger : public ILogger
|
||||||
void report(const char* modName, Level severity,
|
void report(const char* modName, Level severity,
|
||||||
const char* format, va_list ap)
|
const char* format, va_list ap)
|
||||||
{
|
{
|
||||||
std::unique_lock<std::mutex> lk(m);
|
|
||||||
openFile();
|
openFile();
|
||||||
_reportHead(modName, nullptr, severity);
|
_reportHead(modName, nullptr, severity);
|
||||||
vfprintf(fp, format, ap);
|
vfprintf(fp, format, ap);
|
||||||
|
@ -467,7 +460,6 @@ struct FileLogger : public ILogger
|
||||||
void report(const char* modName, Level severity,
|
void report(const char* modName, Level severity,
|
||||||
const wchar_t* format, va_list ap)
|
const wchar_t* format, va_list ap)
|
||||||
{
|
{
|
||||||
std::unique_lock<std::mutex> lk(m);
|
|
||||||
openFile();
|
openFile();
|
||||||
_reportHead(modName, nullptr, severity);
|
_reportHead(modName, nullptr, severity);
|
||||||
vfwprintf(fp, format, ap);
|
vfwprintf(fp, format, ap);
|
||||||
|
@ -479,7 +471,6 @@ struct FileLogger : public ILogger
|
||||||
const char* file, unsigned linenum,
|
const char* file, unsigned linenum,
|
||||||
const char* format, va_list ap)
|
const char* format, va_list ap)
|
||||||
{
|
{
|
||||||
std::unique_lock<std::mutex> lk(m);
|
|
||||||
openFile();
|
openFile();
|
||||||
char sourceInfo[128];
|
char sourceInfo[128];
|
||||||
snprintf(sourceInfo, 128, "%s:%u", file, linenum);
|
snprintf(sourceInfo, 128, "%s:%u", file, linenum);
|
||||||
|
@ -493,7 +484,6 @@ struct FileLogger : public ILogger
|
||||||
const char* file, unsigned linenum,
|
const char* file, unsigned linenum,
|
||||||
const wchar_t* format, va_list ap)
|
const wchar_t* format, va_list ap)
|
||||||
{
|
{
|
||||||
std::unique_lock<std::mutex> lk(m);
|
|
||||||
openFile();
|
openFile();
|
||||||
char sourceInfo[128];
|
char sourceInfo[128];
|
||||||
snprintf(sourceInfo, 128, "%s:%u", file, linenum);
|
snprintf(sourceInfo, 128, "%s:%u", file, linenum);
|
||||||
|
|
Loading…
Reference in New Issue