kernel: Sync log output
All checks were successful
continuous-integration/drone/push Build is passing
All checks were successful
continuous-integration/drone/push Build is passing
This commit is contained in:
parent
6677c643a5
commit
3a4ca73df7
@ -2,6 +2,7 @@
|
|||||||
#include "arch/CPU.h"
|
#include "arch/CPU.h"
|
||||||
#include "arch/Serial.h"
|
#include "arch/Serial.h"
|
||||||
#include "arch/Timer.h"
|
#include "arch/Timer.h"
|
||||||
|
#include "thread/Spinlock.h"
|
||||||
#include "video/TextConsole.h"
|
#include "video/TextConsole.h"
|
||||||
#include <luna/Format.h>
|
#include <luna/Format.h>
|
||||||
#include <luna/SourceLocation.h>
|
#include <luna/SourceLocation.h>
|
||||||
@ -18,11 +19,16 @@ static constexpr u32 RED = 0xffff0000;
|
|||||||
static char log_level_letters[] = { 'D', 'I', 'W', 'E' }; // D for debug, I for info, W for warning, E for error
|
static char log_level_letters[] = { 'D', 'I', 'W', 'E' }; // D for debug, I for info, W for warning, E for error
|
||||||
static const char* ansi_color_codes_per_log_level[] = { "37", "37", "33", "31" }; // 37 is white, 33 yellow, 31 red
|
static const char* ansi_color_codes_per_log_level[] = { "37", "37", "33", "31" }; // 37 is white, 33 yellow, 31 red
|
||||||
|
|
||||||
|
Spinlock g_serial_lock;
|
||||||
|
|
||||||
static void log_serial(LogLevel level, const char* format, va_list origin)
|
static void log_serial(LogLevel level, const char* format, va_list origin)
|
||||||
{
|
{
|
||||||
va_list ap;
|
va_list ap;
|
||||||
va_copy(ap, origin);
|
va_copy(ap, origin);
|
||||||
|
|
||||||
|
const SafeScopeLock lock { g_serial_lock };
|
||||||
|
if (!lock.did_succeed()) return;
|
||||||
|
|
||||||
Serial::printf("\x1b[%sm"
|
Serial::printf("\x1b[%sm"
|
||||||
"%c"
|
"%c"
|
||||||
"\x1b[0m ",
|
"\x1b[0m ",
|
||||||
@ -39,11 +45,15 @@ static void log_serial(LogLevel level, const char* format, va_list origin)
|
|||||||
va_end(ap);
|
va_end(ap);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Spinlock g_console_lock;
|
||||||
|
|
||||||
static void log_text_console(LogLevel level, const char* format, va_list origin)
|
static void log_text_console(LogLevel level, const char* format, va_list origin)
|
||||||
{
|
{
|
||||||
va_list ap;
|
va_list ap;
|
||||||
va_copy(ap, origin);
|
va_copy(ap, origin);
|
||||||
|
|
||||||
|
const ScopeLock lock { g_console_lock };
|
||||||
|
|
||||||
const u32 original_foreground = TextConsole::foreground();
|
const u32 original_foreground = TextConsole::foreground();
|
||||||
const u32 original_background = TextConsole::background();
|
const u32 original_background = TextConsole::background();
|
||||||
|
|
||||||
|
@ -26,3 +26,28 @@ void Spinlock::unlock()
|
|||||||
kwarnln("Spinlock::unlock() called on an unlocked lock with value %d", expected);
|
kwarnln("Spinlock::unlock() called on an unlocked lock with value %d", expected);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
ScopeLock::ScopeLock(Spinlock& lock) : m_lock(lock)
|
||||||
|
{
|
||||||
|
m_lock.lock();
|
||||||
|
}
|
||||||
|
|
||||||
|
ScopeLock::~ScopeLock()
|
||||||
|
{
|
||||||
|
m_lock.unlock();
|
||||||
|
}
|
||||||
|
|
||||||
|
const u32 RETRIES = 5000000;
|
||||||
|
|
||||||
|
SafeScopeLock::SafeScopeLock(Spinlock& lock) : m_lock(lock)
|
||||||
|
{
|
||||||
|
u32 tries_left = RETRIES;
|
||||||
|
while (!lock.try_lock() && --tries_left) { CPU::pause(); }
|
||||||
|
|
||||||
|
if (tries_left) m_success = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
SafeScopeLock::~SafeScopeLock()
|
||||||
|
{
|
||||||
|
if (m_success) m_lock.unlock();
|
||||||
|
}
|
||||||
|
@ -21,6 +21,38 @@ class Spinlock
|
|||||||
Atomic<int> m_lock { 0 };
|
Atomic<int> m_lock { 0 };
|
||||||
};
|
};
|
||||||
|
|
||||||
|
class ScopeLock
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
ScopeLock(Spinlock& lock);
|
||||||
|
~ScopeLock();
|
||||||
|
|
||||||
|
ScopeLock(const ScopeLock&) = delete;
|
||||||
|
ScopeLock(ScopeLock&&) = delete;
|
||||||
|
|
||||||
|
private:
|
||||||
|
Spinlock& m_lock;
|
||||||
|
};
|
||||||
|
|
||||||
|
class SafeScopeLock
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
SafeScopeLock(Spinlock& lock);
|
||||||
|
~SafeScopeLock();
|
||||||
|
|
||||||
|
SafeScopeLock(const SafeScopeLock&) = delete;
|
||||||
|
SafeScopeLock(SafeScopeLock&&) = delete;
|
||||||
|
|
||||||
|
bool did_succeed() const
|
||||||
|
{
|
||||||
|
return m_success;
|
||||||
|
}
|
||||||
|
|
||||||
|
private:
|
||||||
|
Spinlock& m_lock;
|
||||||
|
bool m_success { false };
|
||||||
|
};
|
||||||
|
|
||||||
template <typename T> class LockedValue
|
template <typename T> class LockedValue
|
||||||
{
|
{
|
||||||
struct LockedValueGuard
|
struct LockedValueGuard
|
||||||
|
Loading…
Reference in New Issue
Block a user