Support stopping emulation while all threads are sleeping

This fixes #242
This commit is contained in:
momo5502
2025-05-29 08:28:39 +02:00
parent 4df6e5f174
commit c559c2ff43
3 changed files with 16 additions and 1 deletions

View File

@@ -606,11 +606,13 @@ void windows_emulator::setup_hooks()
void windows_emulator::start(size_t count)
{
this->should_stop = false;
const auto use_count = count > 0;
const auto start_instructions = this->executed_instructions_;
const auto target_instructions = start_instructions + count;
while (true)
while (!this->should_stop)
{
if (this->switch_thread_ || !this->current_thread().is_thread_ready(this->process, this->clock()))
{
@@ -638,6 +640,12 @@ void windows_emulator::start(size_t count)
}
}
void windows_emulator::stop()
{
this->should_stop = true;
this->emu().stop();
}
void windows_emulator::register_factories(utils::buffer_deserializer& buffer)
{
buffer.register_factory<memory_manager_wrapper>([this] {

View File

@@ -132,6 +132,7 @@ class windows_emulator
}
void start(size_t count = 0);
void stop();
void serialize(utils::buffer_serializer& buffer) const;
void deserialize(utils::buffer_deserializer& buffer);
@@ -191,6 +192,7 @@ class windows_emulator
bool switch_thread_{false};
bool use_relative_time_{false};
bool silent_until_main_{false};
std::atomic_bool should_stop{false};
std::unordered_map<uint16_t, uint16_t> port_mappings_{};

View File

@@ -14,6 +14,11 @@ class win_x64_gdb_stub_handler : public x64_gdb_stub_handler
{
}
void on_interrupt() override
{
this->win_emu_->stop();
}
bool should_stop() override
{
return this->should_stop_();