Annotation of nono/debugger/cvprompt.h, 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: #pragma once
                      8: 
                      9: #include <condition_variable>
                     10: #include <mutex>
                     11: 
                     12: // デバッガプロンプトについての条件変数
                     13: class CVPrompt
                     14: {
                     15:  public:
                     16:        // プロンプトを出してよいというCPUからの通知
                     17:        void NotifyAcquire()
                     18:        {
                     19:                std::unique_lock<std::mutex> lk(mtx);
                     20:                is_prompt = true;
                     21:                cvAcquire.notify_one();
                     22:        }
                     23: 
1.1.1.2   root       24:        // CPU がプロンプトを出してよいと言うまで待つ。
                     25:        // プロンプトを出して良いときは true を返す。
                     26:        // タイムアウトすると false を返す。
                     27:        bool WaitAcquire(int timeoutmsec)
1.1       root       28:        {
1.1.1.2   root       29:                std::chrono::milliseconds timeout(timeoutmsec);
                     30:                std::unique_lock<std::mutex> lk(mtx);
                     31:                cvAcquire.wait_for(lk, timeout, [&] { return is_prompt; });
                     32:                return is_prompt;
1.1       root       33:        }
                     34: 
                     35:        // プロンプト終了したことをCPUに通知
                     36:        void NotifyRelease()
                     37:        {
                     38:                std::unique_lock<std::mutex> lk(mtx);
                     39:                is_prompt = false;
                     40:                cvRelease.notify_one();
                     41:        }
                     42: 
                     43:        // プロンプト終了を待つ
                     44:        void WaitRelease()
                     45:        {
                     46:                std::unique_lock<std::mutex> lk(mtx);
                     47:                cvRelease.wait(lk, [&] { return !is_prompt; });
                     48:        }
                     49: 
                     50:        // プロンプト出している状態なら true を返す
                     51:        bool IsPrompt() const {
                     52:                return is_prompt;
                     53:        }
                     54: 
                     55:  private:
1.1.1.4 ! root       56:        volatile bool is_prompt {};                     // プロンプト中なら true
        !            57:        std::mutex mtx {};
        !            58:        std::condition_variable cvAcquire {};
        !            59:        std::condition_variable cvRelease {};
1.1       root       60: };
                     61: 
                     62: // debugger.cpp で初期化
                     63: extern CVPrompt *gCVPrompt;

unix.superglobalmegacorp.com

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