--- nono/lib/logger.cpp 2026/04/29 17:04:34 1.1.1.3 +++ nono/lib/logger.cpp 2026/04/29 17:05:08 1.1.1.5 @@ -4,11 +4,11 @@ // Licensed under nono-license.txt // -#include "logger.h" -#include "mpu.h" +// +// ログ +// -// グローバルインスタンス -Logger gLogger; +#include "logger.h" // コンストラクタ Logger::Logger() @@ -24,17 +24,19 @@ Logger::~Logger() void Logger::Write(const char *str) { - std::unique_lock lk(mtx); + std::lock_guard lk(mtx); // パイプへ出力 (EOL まで出力する) for (const char *s = str; ; s++) { - // 一杯なら古いのを捨てて書き込み続ける - if (pipe.Enqueue(*s) == false) { - uint8 dummy; - pipe.Dequeue(&dummy); - pipe.Enqueue(*s); + if (pipe.IsFull()) { + // 一杯なら古い 1 行を捨てる + while (pipe.Dequeue() != '\0') { + // nop + } } - if (*s == '\0') + pipe.Enqueue(*s); + if (*s == '\0') { break; + } } // 必要なら標準出力にも出力 if (use_stdout) { @@ -49,7 +51,7 @@ Logger::Read(char *buf, int bufsize) uint8 ch; int i; - std::unique_lock lk(mtx); + std::lock_guard lk(mtx); for (i = 0; i < bufsize - 1 && pipe.Dequeue(&ch); ) { buf[i++] = ch; if (ch == '\0') { @@ -66,21 +68,3 @@ Logger::Read(char *buf, int bufsize) } return (i != 0); } - - -// パニック -void -panic(const char *funcname, const char *fmt, ...) -{ - char fmtbuf[1024]; - va_list ap; - - va_start(ap, fmt); - vsnprintf(fmtbuf, sizeof(fmtbuf), fmt, ap); - va_end(ap); - - // panic の場合ここでプロセス終了するのでログではなく stderr に出力 - fprintf(stderr, "panic! PC=$%08x %s at %s\n", - gMPU->GetPPC(), fmtbuf, funcname); - abort(); -}