|
|
nono 0.1.2
//
// nono
// Copyright (C) 2020 nono project
// Licensed under nono-license.txt
//
#pragma once
#include <condition_variable>
#include <mutex>
// デバッガプロンプトについての条件変数
class CVPrompt
{
public:
// プロンプトを出してよいというCPUからの通知
void NotifyAcquire()
{
std::unique_lock<std::mutex> lk(mtx);
is_prompt = true;
cvAcquire.notify_one();
}
// CPU がプロンプトを出してよいと言うまで待つ。
// プロンプトを出して良いときは true を返す。
// タイムアウトすると false を返す。
bool WaitAcquire(int timeoutmsec)
{
std::chrono::milliseconds timeout(timeoutmsec);
std::unique_lock<std::mutex> lk(mtx);
cvAcquire.wait_for(lk, timeout, [&] { return is_prompt; });
return is_prompt;
}
// プロンプト終了したことをCPUに通知
void NotifyRelease()
{
std::unique_lock<std::mutex> lk(mtx);
is_prompt = false;
cvRelease.notify_one();
}
// プロンプト終了を待つ
void WaitRelease()
{
std::unique_lock<std::mutex> lk(mtx);
cvRelease.wait(lk, [&] { return !is_prompt; });
}
// プロンプト出している状態なら true を返す
bool IsPrompt() const {
return is_prompt;
}
private:
volatile bool is_prompt {}; // プロンプト中なら true
std::mutex mtx {};
std::condition_variable cvAcquire {};
std::condition_variable cvRelease {};
};
// debugger.cpp で初期化
extern CVPrompt *gCVPrompt;
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.