--- nono/debugger/cvprompt.h 2026/04/29 17:04:28 1.1 +++ nono/debugger/cvprompt.h 2026/04/29 17:04:33 1.1.1.3 @@ -1,11 +1,11 @@ // // nono -// Copyright (C) 2019 isaki@NetBSD.org +// Copyright (C) 2020 nono project +// Licensed under nono-license.txt // #pragma once -#include "consio.h" #include #include @@ -21,27 +21,15 @@ class CVPrompt cvAcquire.notify_one(); } - // プロンプトを出せるようになるのを待つ - void WaitAcquire(Consio* cons) + // CPU がプロンプトを出してよいと言うまで待つ。 + // プロンプトを出して良いときは true を返す。 + // タイムアウトすると false を返す。 + bool WaitAcquire(int timeoutmsec) { - std::chrono::milliseconds timeout(200); - - for (;;) { - std::unique_lock lk(mtx); - cvAcquire.wait_for(lk, timeout, [&] { return is_prompt; }); - - // 条件成立 - if (is_prompt) { - return; - } - - // XXX 仕方ないのでここで定期的にコネクションの状態を調べる。 - // XXX Poll() は EOF で 1 を返すのでここでは着信と EOF の区別は - // できない。 - if (cons->Poll() != 0) { - return; - } - } + std::chrono::milliseconds timeout(timeoutmsec); + std::unique_lock lk(mtx); + cvAcquire.wait_for(lk, timeout, [&] { return is_prompt; }); + return is_prompt; } // プロンプト終了したことをCPUに通知 @@ -65,7 +53,7 @@ class CVPrompt } private: - bool is_prompt = false; // プロンプト中なら true + volatile bool is_prompt = false; // プロンプト中なら true std::mutex mtx; std::condition_variable cvAcquire; std::condition_variable cvRelease;