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