core/log: Remove insane mutex trylocks

master
Perttu Ahola 2014-10-30 14:23:30 +02:00
parent e5533371e7
commit 1786c8b02a
1 changed files with 14 additions and 44 deletions

View File

@ -1,6 +1,8 @@
// http://www.apache.org/licenses/LICENSE-2.0
// Copyright 2014 Perttu Ahola <celeron55@gmail.com>
#include "log.h"
#include "interface/mutex.h"
//#include "interface/thread.h"
#include "c55/os.h"
#include <atomic>
#include <cstdint>
@ -13,9 +15,6 @@
#else
#include <pthread.h>
#endif
#include <errno.h> // EBUSY
pthread_mutex_t log_mutex;
const int CORE_FATAL = 0;
const int CORE_ERROR = 1;
@ -31,6 +30,9 @@ static const bool use_colors = false;
static const bool use_colors = true;
#endif
static interface::Mutex log_mutex;
//static interface::Thread *log_active_thread = nullptr;
static std::atomic_bool line_begin(true);
static std::atomic_int current_level(0);
static std::atomic_int max_level(CORE_INFO);
@ -39,7 +41,6 @@ static FILE *file = NULL;
void log_init()
{
pthread_mutex_init(&log_mutex, NULL);
}
void log_set_max_level(int level)
@ -54,23 +55,23 @@ int log_get_max_level()
void log_set_file(const char *path)
{
pthread_mutex_lock(&log_mutex);
log_mutex.lock();
file = fopen(path, "a");
if(file)
fprintf(stderr, "Opened log file \"%s\"\n", path);
else
log_w("__log", "Failed to open log file \"%s\"", path);
pthread_mutex_unlock(&log_mutex);
log_mutex.unlock();
}
void log_close()
{
pthread_mutex_lock(&log_mutex);
log_mutex.lock();
if(file){
fclose(file);
file = NULL;
}
pthread_mutex_unlock(&log_mutex);
log_mutex.unlock();
}
void log_nl_nolock()
@ -94,17 +95,8 @@ void log_nl()
line_begin = true;
return;
}
int r = pthread_mutex_trylock(&log_mutex);
if(r == EBUSY){
// Yo dawg, I heard you like logging so I'm launching a signal handler
// in the middle of your logging routine!
// Just call the damn function; it's fine enough for the rare occasions
// this happens in
log_nl_nolock();
return;
}
interface::MutexScope ms(log_mutex);
log_nl_nolock();
pthread_mutex_unlock(&log_mutex);
}
static void print(int level, const char *sys, const char *fmt, va_list va_args)
@ -157,7 +149,7 @@ static void print(int level, const char *sys, const char *fmt, va_list va_args)
}
// Does not require any locking
static void fallback_print(int level, const char *sys, const char *fmt,
/*static void fallback_print(int level, const char *sys, const char *fmt,
va_list va_args)
{
FILE *f = file;
@ -167,30 +159,19 @@ static void fallback_print(int level, const char *sys, const char *fmt,
fprintf(f, "\033[0m"); // reset
vfprintf(f, fmt, va_args);
fprintf(f, "\n");
}
}*/
void log_(int level, const char *sys, const char *fmt, ...)
{
if(level > max_level){ // Fast path
return;
}
int r = pthread_mutex_trylock(&log_mutex);
if(r == EBUSY){
// Yo dawg, I heard you like logging so I'm launching a signal handler
// in the middle of your logging routine so you can synchronize your
// threads while you are synchronizing your threads
va_list va_args;
va_start(va_args, fmt);
fallback_print(level, sys, fmt, va_args);
va_end(va_args);
return;
}
interface::MutexScope ms(log_mutex);
va_list va_args;
va_start(va_args, fmt);
print(level, sys, fmt, va_args);
log_nl_nolock();
va_end(va_args);
pthread_mutex_unlock(&log_mutex);
}
void log_no_nl(int level, const char *sys, const char *fmt, ...)
@ -198,21 +179,10 @@ void log_no_nl(int level, const char *sys, const char *fmt, ...)
if(level > max_level){ // Fast path
return;
}
int r = pthread_mutex_trylock(&log_mutex);
if(r == EBUSY){
// Yo dawg, I heard you like logging so I'm launching a signal handler
// in the middle of your logging routine so you can synchronize your
// threads while you are synchronizing your threads
va_list va_args;
va_start(va_args, fmt);
fallback_print(level, sys, fmt, va_args);
va_end(va_args);
return;
}
interface::MutexScope ms(log_mutex);
va_list va_args;
va_start(va_args, fmt);
print(level, sys, fmt, va_args);
va_end(va_args);
pthread_mutex_unlock(&log_mutex);
}
// vim: set noet ts=4 sw=4: