Annotation of nono/lib/logger.cpp, revision 1.1.1.4

1.1       root        1: //
                      2: // nono
1.1.1.3   root        3: // Copyright (C) 2020 nono project
                      4: // Licensed under nono-license.txt
1.1       root        5: //
                      6: 
                      7: #include "logger.h"
                      8: #include "mpu.h"
                      9: 
1.1.1.3   root       10: // グローバルインスタンス
                     11: Logger gLogger;
1.1       root       12: 
                     13: // コンストラクタ
                     14: Logger::Logger()
                     15: {
                     16: }
                     17: 
                     18: // デストラクタ
                     19: Logger::~Logger()
                     20: {
                     21: }
                     22: 
                     23: // ログ書き込み
                     24: void
                     25: Logger::Write(const char *str)
                     26: {
                     27:        std::unique_lock<std::mutex> lk(mtx);
                     28:        // パイプへ出力 (EOL まで出力する)
                     29:        for (const char *s = str; ; s++) {
1.1.1.4 ! root       30:                if (pipe.IsFull()) {
        !            31:                        // 一杯なら古い 1 行を捨てる
        !            32:                        while (pipe.Dequeue() != '\0') {
        !            33:                                // nop
        !            34:                        }
1.1       root       35:                }
1.1.1.4 ! root       36:                pipe.Enqueue(*s);
        !            37:                if (*s == '\0') {
1.1       root       38:                        break;
1.1.1.4 ! root       39:                }
1.1       root       40:        }
                     41:        // 必要なら標準出力にも出力
                     42:        if (use_stdout) {
                     43:                printf("%s\n", str);
                     44:        }
                     45: }
                     46: 
                     47: // ログ読み出し
                     48: bool
                     49: Logger::Read(char *buf, int bufsize)
                     50: {
                     51:        uint8 ch;
                     52:        int i;
                     53: 
                     54:        std::unique_lock<std::mutex> lk(mtx);
                     55:        for (i = 0; i < bufsize - 1 && pipe.Dequeue(&ch); ) {
                     56:                buf[i++] = ch;
                     57:                if (ch == '\0') {
                     58:                        break;
                     59:                }
                     60:        }
                     61:        // buf が足りない場合ここで打ち切り
                     62:        if (i == bufsize - 1) {
                     63:                // ただし EOL 含めて bufsize ぴったりなら取り出しておく
                     64:                if (pipe.Peek(0) == '\0') {
                     65:                        pipe.Dequeue(&ch);
                     66:                }
                     67:                buf[i] = '\0';
                     68:        }
                     69:        return (i != 0);
                     70: }
                     71: 
                     72: 
                     73: // パニック
                     74: void
                     75: panic(const char *funcname, const char *fmt, ...)
                     76: {
                     77:        char fmtbuf[1024];
                     78:        va_list ap;
                     79: 
                     80:        va_start(ap, fmt);
                     81:        vsnprintf(fmtbuf, sizeof(fmtbuf), fmt, ap);
                     82:        va_end(ap);
                     83: 
                     84:        // panic の場合ここでプロセス終了するのでログではなく stderr に出力
                     85:        fprintf(stderr, "panic! PC=$%08x %s at %s\n",
1.1.1.2   root       86:                gMPU->GetPPC(), fmtbuf, funcname);
1.1       root       87:        abort();
                     88: }

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.