|
|
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;
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.