|
|
1.1 root 1: //
2: // nono
3: // Copyright (C) 2019 [email protected]
4: //
5:
6: #pragma once
7:
8: #include "consio.h"
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:
24: // プロンプトを出せるようになるのを待つ
25: void WaitAcquire(Consio* cons)
26: {
27: std::chrono::milliseconds timeout(200);
28:
29: for (;;) {
30: std::unique_lock<std::mutex> lk(mtx);
31: cvAcquire.wait_for(lk, timeout, [&] { return is_prompt; });
32:
33: // 条件成立
34: if (is_prompt) {
35: return;
36: }
37:
38: // XXX 仕方ないのでここで定期的にコネクションの状態を調べる。
39: // XXX Poll() は EOF で 1 を返すのでここでは着信と EOF の区別は
40: // できない。
41: if (cons->Poll() != 0) {
42: return;
43: }
44: }
45: }
46:
47: // プロンプト終了したことをCPUに通知
48: void NotifyRelease()
49: {
50: std::unique_lock<std::mutex> lk(mtx);
51: is_prompt = false;
52: cvRelease.notify_one();
53: }
54:
55: // プロンプト終了を待つ
56: void WaitRelease()
57: {
58: std::unique_lock<std::mutex> lk(mtx);
59: cvRelease.wait(lk, [&] { return !is_prompt; });
60: }
61:
62: // プロンプト出している状態なら true を返す
63: bool IsPrompt() const {
64: return is_prompt;
65: }
66:
67: private:
68: bool is_prompt = false; // プロンプト中なら true
69: std::mutex mtx;
70: std::condition_variable cvAcquire;
71: std::condition_variable cvRelease;
72: };
73:
74: // debugger.cpp で初期化
75: extern CVPrompt *gCVPrompt;
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.