From dceb9550c95d89f3d2b7e374bde9b47cb9d35091 Mon Sep 17 00:00:00 2001 From: Ben Vanik Date: Mon, 18 May 2015 19:17:07 -0700 Subject: [PATCH] Adding global lock for slist (this is what reactos does). --- src/xenia/kernel/xboxkrnl_threading.cc | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/src/xenia/kernel/xboxkrnl_threading.cc b/src/xenia/kernel/xboxkrnl_threading.cc index 4b0cb1574..518c78dbf 100644 --- a/src/xenia/kernel/xboxkrnl_threading.cc +++ b/src/xenia/kernel/xboxkrnl_threading.cc @@ -1289,13 +1289,17 @@ SHIM_CALL KeRemoveQueueDpc_shim(PPCContext* ppc_state, KernelState* state) { SHIM_SET_RETURN_64(result ? 1 : 0); } +std::mutex global_list_mutex_; + // http://www.nirsoft.net/kernel_struct/vista/SLIST_HEADER.html -SHIM_CALL InterlockedPopEntrySList_shim(PPCContext* ppc_state, KernelState* state) { +SHIM_CALL InterlockedPopEntrySList_shim(PPCContext* ppc_state, + KernelState* state) { uint32_t plist_ptr = SHIM_GET_ARG_32(0); XELOGD("InterlockedPopEntrySList(%.8X)", plist_ptr); - // TODO: Interlocked part of this + std::lock_guard lock(global_list_mutex_); + uint8_t* p = state->memory()->TranslateVirtual(plist_ptr); auto first = xe::load_and_swap(p); if (first == 0) {