File:  [Isaki's NoNo m68k/m88k emulator] / nono / debugger / cvprompt.h
Revision 1.1.1.4 (vendor branch): download - view: text, annotated - select for diffs
Wed Apr 29 17:04:40 2026 UTC (2 months, 3 weeks ago) by root
Branches: MAIN, Isaki
CVS tags: v014, v013, v012, v011, v010, v009, v008, v007, v006, HEAD
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;

unix.superglobalmegacorp.com

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