--- nono/lib/logger.cpp 2026/04/29 17:04:28 1.1 +++ nono/lib/logger.cpp 2026/04/29 17:05:08 1.1.1.5 @@ -1,13 +1,14 @@ // // nono -// Copyright (C) 2017 isaki@NetBSD.org +// Copyright (C) 2020 nono project +// Licensed under nono-license.txt // -#include "header.h" -#include "logger.h" -#include "mpu.h" +// +// ログ +// -Logger *gLogger; +#include "logger.h" // コンストラクタ Logger::Logger() @@ -23,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) { @@ -48,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') { @@ -65,28 +68,3 @@ Logger::Read(char *buf, int bufsize) } return (i != 0); } - - -// ログ初期化 -void -logger_init() -{ - gLogger = new Logger(); -} - -// パニック -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->GetCPU()->ppc, fmtbuf, funcname); - abort(); -}