fn try_lock_log() -> Option<MutexGuard<'static, ()>>Expand description
ログ 1 行を組み立てて、まとめて出力する。
§デッドロックを作らないための決め事
ロックが取れないまま有限回спинしたら、諦めてロック無しで出す。
行が混ざるのは困るが、ログが原因で系全体が止まる方がはるかに悪い。
例外ハンドラがロックを握ったまま死んだ場合でも、これで先へ進める。
ログ用ロックを有限回だけ待つ。取れなければ None。
取れなくても必ず出力はする(呼び出し側で None のまま進む)。
行が混ざるのは困るが、ログが原因で系全体が止まる方がはるかに悪い。
例外ハンドラがロックを握ったまま死んだ場合でも、これで先へ進める。
§上限は「時間」で決める
【2026-08-05】最初は回数(10 万回)で切ったが短すぎた。 115200 baud では 1 文字 ≈ 87µs、100 文字の行で ≈ 9ms かかる。 一方 10 万回のスピンは 1ms にも満たないので、 先行する行を書き終える前に諦めて混線が残っていた (実測: 399 行中 2 行)。
tick 基準にすれば CPU 速度に依らず「行 1 本ぶんは待つ」が保証できる。 tick が進まない状況(呼び出し元が割り込みを止めている等)でも 止まらないよう、回数の上限も併せて置く。