Suspend/resume working.

This commit is contained in:
Ben Vanik
2013-12-23 19:46:35 -08:00
parent dc48b0a85a
commit 98efc7ddfa
11 changed files with 95 additions and 28 deletions

View File

@@ -28,6 +28,8 @@ XenonThreadState::XenonThreadState(
stack_address_ = memory_->HeapAlloc(
0, stack_size, MEMORY_FLAG_ZERO);
debug_break_ = CreateEvent(NULL, FALSE, FALSE, NULL);
// Allocate with 64b alignment.
context_ = (PPCContext*)xe_malloc_aligned(sizeof(PPCContext));
XEASSERT(((uint64_t)context_ & 0xF) == 0);
@@ -53,6 +55,8 @@ XenonThreadState::XenonThreadState(
XenonThreadState::~XenonThreadState() {
runtime_->debugger()->OnThreadDestroyed(this);
CloseHandle(debug_break_);
alloy::tracing::WriteEvent(EventType::ThreadDeinit({
}));
@@ -60,10 +64,31 @@ XenonThreadState::~XenonThreadState() {
memory_->HeapFree(stack_address_, stack_size_);
}
volatile int* XenonThreadState::suspend_flag_address() const {
return &context_->suspend_flag;
}
int XenonThreadState::Suspend(uint32_t timeout_ms) {
// Set suspend flag.
// One of the checks should call in to OnSuspend() at some point.
xe_atomic_inc_32(&context_->suspend_flag);
return 0;
}
int XenonThreadState::Resume() {
int XenonThreadState::Resume(bool force) {
if (context_->suspend_flag) {
if (force) {
context_->suspend_flag = 0;
SetEvent(debug_break_);
} else {
if (!xe_atomic_dec_32(&context_->suspend_flag)) {
SetEvent(debug_break_);
}
}
}
return 0;
}
void XenonThreadState::EnterSuspend() {
WaitForSingleObject(debug_break_, INFINITE);
}