1

make logger static and add name wrapper

This commit is contained in:
2022-07-22 23:32:36 +02:00
parent 60a01461b0
commit ec09b0e6d2
2 changed files with 46 additions and 14 deletions

View File

@ -1,6 +1,7 @@
#include "user/lib/Logger.h" #include "user/lib/Logger.h"
#include "kernel/Globals.h" #include "kernel/Globals.h"
SpinLock Logger::sem;
bool Logger::kout_enabled = true; bool Logger::kout_enabled = true;
bool Logger::serial_enabled = true; bool Logger::serial_enabled = true;
// const Semaphore Logger::sem = Semaphore(1); // 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_white = "\033[1;37m";
constexpr char* ansi_default = "\033[0;39m "; constexpr char* ansi_default = "\033[0;39m ";
// TODO: Lock this
void Logger::log(char* message, CGA::color col) const { void Logger::log(char* message, CGA::color col) const {
if (Logger::kout_enabled) { if (Logger::kout_enabled) {
CGA::color old_col = kout.color_fg; CGA::color old_col = kout.color_fg;
kout << fgc(col) kout << fgc(col)
<< Logger::level_to_string(this->current_message_level) << "::" << Logger::level_to_string(this->current_message_level) << "::"
<< this->name << ":: "
<< message << fgc(old_col); << message << fgc(old_col);
kout.flush(); // Don't add newline, Logger already does that kout.flush(); // Don't add newline, Logger already does that
} }
@ -45,8 +44,6 @@ void Logger::log(char* message, CGA::color col) const {
} }
serial.write(Logger::level_to_string(this->current_message_level)); serial.write(Logger::level_to_string(this->current_message_level));
serial.write(":: "); serial.write(":: ");
serial.write(this->name);
serial.write(":: ");
serial.write(message); serial.write(message);
serial.write('\r'); serial.write('\r');
// serial.write("\r\n"); // serial.write("\r\n");
@ -73,6 +70,7 @@ void Logger::flush() {
this->current_message_level = Logger::INFO; this->current_message_level = Logger::INFO;
this->pos = 0; this->pos = 0;
Logger::unlock();
} }
void Logger::trace(char* message) const { void Logger::trace(char* message) const {

View File

@ -3,25 +3,31 @@
#include "devices/CGA.h" #include "devices/CGA.h"
#include "lib/OutStream.h" #include "lib/OutStream.h"
// #include "lib/Semaphore.h" #include "lib/SpinLock.h"
class Logger : public OutStream { class Logger : public OutStream {
private: public:
Logger(const Logger& copy) = delete; 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 kout_enabled;
static bool serial_enabled; static bool serial_enabled;
// TODO: Don't mix logs
// static const Semaphore sem;
void log(char* message, CGA::color col) const; void log(char* message, CGA::color col) const;
public: friend class NamedLogger; // Allow NamedLogger to lock/unlock
Logger(char* name) : name(name) {} static SpinLock sem;
virtual ~Logger() = default; static void lock() { Logger::sem.acquire(); }
static void unlock() { Logger::sem.release(); }
public:
enum LogLevel { enum LogLevel {
TRACE, TRACE,
DEBUG, DEBUG,
@ -76,4 +82,32 @@ Logger& DEBUG(Logger& log);
Logger& ERROR(Logger& log); Logger& ERROR(Logger& log);
Logger& INFO(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 #endif