Misc threading fixes and flags to ignore priorities/affinities.

This commit is contained in:
Ben Vanik 2015-05-21 22:33:29 -07:00
parent 37f1953466
commit 4d41840728
3 changed files with 16 additions and 5 deletions

View File

@ -18,6 +18,11 @@
#include "xenia/kernel/objects/xuser_module.h" #include "xenia/kernel/objects/xuser_module.h"
#include "xenia/profiling.h" #include "xenia/profiling.h"
DEFINE_bool(ignore_thread_priorities, true,
"Ignores game-specified thread priorities.");
DEFINE_bool(ignore_thread_affinities, true,
"Ignores game-specified thread affinities.");
namespace xe { namespace xe {
namespace kernel { namespace kernel {
@ -537,9 +542,9 @@ int32_t XThread::QueryPriority() { return GetThreadPriority(thread_handle_); }
void XThread::SetPriority(int32_t increment) { void XThread::SetPriority(int32_t increment) {
int target_priority = 0; int target_priority = 0;
if (increment > 0x11) { if (increment > 0x22) {
target_priority = THREAD_PRIORITY_HIGHEST; target_priority = THREAD_PRIORITY_HIGHEST;
} else if (increment > 0) { } else if (increment > 0x11) {
target_priority = THREAD_PRIORITY_ABOVE_NORMAL; target_priority = THREAD_PRIORITY_ABOVE_NORMAL;
} else if (increment < -0x22) { } else if (increment < -0x22) {
target_priority = THREAD_PRIORITY_IDLE; target_priority = THREAD_PRIORITY_IDLE;
@ -548,7 +553,9 @@ void XThread::SetPriority(int32_t increment) {
} else { } else {
target_priority = THREAD_PRIORITY_NORMAL; target_priority = THREAD_PRIORITY_NORMAL;
} }
SetThreadPriority(thread_handle_, target_priority); if (!FLAGS_ignore_thread_priorities) {
SetThreadPriority(thread_handle_, target_priority);
}
} }
void XThread::SetAffinity(uint32_t affinity) { void XThread::SetAffinity(uint32_t affinity) {
@ -567,7 +574,9 @@ void XThread::SetAffinity(uint32_t affinity) {
if (system_info.dwNumberOfProcessors < 6) { if (system_info.dwNumberOfProcessors < 6) {
XELOGW("Too few processors - scheduling will be wonky"); XELOGW("Too few processors - scheduling will be wonky");
} }
SetThreadAffinityMask(reinterpret_cast<HANDLE>(thread_handle_), affinity); if (!FLAGS_ignore_thread_affinities) {
SetThreadAffinityMask(reinterpret_cast<HANDLE>(thread_handle_), affinity);
}
} }
X_STATUS XThread::Resume(uint32_t* out_suspend_count) { X_STATUS XThread::Resume(uint32_t* out_suspend_count) {

View File

@ -547,7 +547,7 @@ spin:
// TODO(benvanik): contention - do a real wait! // TODO(benvanik): contention - do a real wait!
// XELOGE("RtlEnterCriticalSection tried to really lock!"); // XELOGE("RtlEnterCriticalSection tried to really lock!");
spin_wait_remaining = 0; // HACK: spin forever spin_wait_remaining = 0; // HACK: spin forever
Sleep(1); SwitchToThread();
goto spin; goto spin;
} }

View File

@ -260,11 +260,13 @@ SHIM_CALL KeSetBasePriorityThread_shim(PPCContext* ppc_state,
XELOGD("KeSetBasePriorityThread - Interpreting thread ptr as handle!"); XELOGD("KeSetBasePriorityThread - Interpreting thread ptr as handle!");
} else { } else {
thread = (XThread*)XObject::GetObject(state, SHIM_MEM_ADDR(thread_ptr)); thread = (XThread*)XObject::GetObject(state, SHIM_MEM_ADDR(thread_ptr));
thread->Retain();
} }
if (thread) { if (thread) {
prev_priority = thread->QueryPriority(); prev_priority = thread->QueryPriority();
thread->SetPriority(increment); thread->SetPriority(increment);
thread->Release();
} }
SHIM_SET_RETURN_32(prev_priority); SHIM_SET_RETURN_32(prev_priority);