make logger static and add name wrapper
This commit is contained in:
@ -1,6 +1,7 @@
|
||||
#include "user/lib/Logger.h"
|
||||
#include "kernel/Globals.h"
|
||||
|
||||
SpinLock Logger::sem;
|
||||
bool Logger::kout_enabled = true;
|
||||
bool Logger::serial_enabled = true;
|
||||
// const Semaphore Logger::sem = Semaphore(1);
|
||||
@ -16,13 +17,11 @@ constexpr char* ansi_cyan = "\033[1;36m";
|
||||
constexpr char* ansi_white = "\033[1;37m";
|
||||
constexpr char* ansi_default = "\033[0;39m ";
|
||||
|
||||
// TODO: Lock this
|
||||
void Logger::log(char* message, CGA::color col) const {
|
||||
if (Logger::kout_enabled) {
|
||||
CGA::color old_col = kout.color_fg;
|
||||
kout << fgc(col)
|
||||
<< Logger::level_to_string(this->current_message_level) << "::"
|
||||
<< this->name << ":: "
|
||||
<< message << fgc(old_col);
|
||||
kout.flush(); // Don't add newline, Logger already does that
|
||||
}
|
||||
@ -44,8 +43,6 @@ void Logger::log(char* message, CGA::color col) const {
|
||||
serial.write(ansi_default);
|
||||
}
|
||||
serial.write(Logger::level_to_string(this->current_message_level));
|
||||
serial.write("::");
|
||||
serial.write(this->name);
|
||||
serial.write(":: ");
|
||||
serial.write(message);
|
||||
serial.write('\r');
|
||||
@ -73,6 +70,7 @@ void Logger::flush() {
|
||||
|
||||
this->current_message_level = Logger::INFO;
|
||||
this->pos = 0;
|
||||
Logger::unlock();
|
||||
}
|
||||
|
||||
void Logger::trace(char* message) const {
|
||||
|
@ -3,25 +3,31 @@
|
||||
|
||||
#include "devices/CGA.h"
|
||||
#include "lib/OutStream.h"
|
||||
// #include "lib/Semaphore.h"
|
||||
#include "lib/SpinLock.h"
|
||||
|
||||
class Logger : public OutStream {
|
||||
private:
|
||||
Logger(const Logger& copy) = delete;
|
||||
public:
|
||||
static Logger& instance() {
|
||||
static Logger log;
|
||||
return log;
|
||||
}
|
||||
|
||||
private:
|
||||
Logger() = default;
|
||||
Logger(const Logger& copy) = delete;
|
||||
void operator=(const Logger& copy) = delete;
|
||||
|
||||
char* name;
|
||||
static bool kout_enabled;
|
||||
static bool serial_enabled;
|
||||
|
||||
// TODO: Don't mix logs
|
||||
// static const Semaphore sem;
|
||||
|
||||
void log(char* message, CGA::color col) const;
|
||||
|
||||
public:
|
||||
Logger(char* name) : name(name) {}
|
||||
virtual ~Logger() = default;
|
||||
friend class NamedLogger; // Allow NamedLogger to lock/unlock
|
||||
static SpinLock sem;
|
||||
static void lock() { Logger::sem.acquire(); }
|
||||
static void unlock() { Logger::sem.release(); }
|
||||
|
||||
public:
|
||||
enum LogLevel {
|
||||
TRACE,
|
||||
DEBUG,
|
||||
@ -76,4 +82,32 @@ Logger& DEBUG(Logger& log);
|
||||
Logger& ERROR(Logger& log);
|
||||
Logger& INFO(Logger& log);
|
||||
|
||||
class NamedLogger {
|
||||
private:
|
||||
char* name;
|
||||
|
||||
public:
|
||||
NamedLogger(char* name) : name(name) {}
|
||||
|
||||
Logger& trace() {
|
||||
Logger::lock();
|
||||
return Logger::instance() << TRACE << name << "::";
|
||||
}
|
||||
|
||||
Logger& debug() {
|
||||
Logger::lock();
|
||||
return Logger::instance() << DEBUG << name << "::";
|
||||
}
|
||||
|
||||
Logger& error() {
|
||||
Logger::lock();
|
||||
return Logger::instance() << ERROR << name << "::";
|
||||
}
|
||||
|
||||
Logger& info() {
|
||||
Logger::lock();
|
||||
return Logger::instance() << INFO << name << "::";
|
||||
}
|
||||
};
|
||||
|
||||
#endif
|
||||
|
Reference in New Issue
Block a user