From 049da82036e293833d96e6e2caa87039218db084 Mon Sep 17 00:00:00 2001 From: Gliniak Date: Mon, 25 Jan 2021 08:49:48 +0100 Subject: [PATCH] IoCompletion: Removed !wait_ticks check --- src/xenia/kernel/xboxkrnl/xboxkrnl_io.cc | 13 ++++++++++--- src/xenia/kernel/xiocompletion.cc | 2 +- 2 files changed, 11 insertions(+), 4 deletions(-) diff --git a/src/xenia/kernel/xboxkrnl/xboxkrnl_io.cc b/src/xenia/kernel/xboxkrnl/xboxkrnl_io.cc index 86890ec6b..18b6c30e9 100644 --- a/src/xenia/kernel/xboxkrnl/xboxkrnl_io.cc +++ b/src/xenia/kernel/xboxkrnl/xboxkrnl_io.cc @@ -449,7 +449,8 @@ dword_result_t NtSetIoCompletion(dword_t handle, dword_t key_context, port->QueueNotification(notification); return X_STATUS_SUCCESS; } -DECLARE_XBOXKRNL_EXPORT1(NtSetIoCompletion, kFileSystem, kImplemented); +DECLARE_XBOXKRNL_EXPORT2(NtSetIoCompletion, kFileSystem, kImplemented, + kHighFrequency); // Dequeues a packet from the completion port. dword_result_t NtRemoveIoCompletion( @@ -479,12 +480,18 @@ dword_result_t NtRemoveIoCompletion( io_status_block->information = notification.num_bytes; } } else { - status = X_STATUS_TIMEOUT; + // TODO(Gliniak): We're returning X_STATUS_SUCCESS here instead of + // X_STATUS_TIMEOUT due to timing issues between threads when subthread + // execute NtRemoveIoCompletion before mainthread execute NtSetIoCompletion + // Returning X_STATUS_SUCCESS suprisingly doesn't bother titles that uses + // this function, but X_STATUS_TIMEOUT causes them to lock + status = X_STATUS_SUCCESS; } return status; } -DECLARE_XBOXKRNL_EXPORT1(NtRemoveIoCompletion, kFileSystem, kImplemented); +DECLARE_XBOXKRNL_EXPORT2(NtRemoveIoCompletion, kFileSystem, kImplemented, + kHighFrequency); dword_result_t NtQueryFullAttributesFile( pointer_t obj_attribs, diff --git a/src/xenia/kernel/xiocompletion.cc b/src/xenia/kernel/xiocompletion.cc index 94d49a5f5..638a0a3ef 100644 --- a/src/xenia/kernel/xiocompletion.cc +++ b/src/xenia/kernel/xiocompletion.cc @@ -30,7 +30,7 @@ bool XIOCompletion::WaitForNotification(uint64_t wait_ticks, IONotification* notify) { auto ms = std::chrono::milliseconds(TimeoutTicksToMs(wait_ticks)); auto res = threading::Wait(notification_semaphore_.get(), false, ms); - if (res == threading::WaitResult::kSuccess || !wait_ticks) { + if (res == threading::WaitResult::kSuccess) { std::unique_lock lock(notification_lock_); assert_false(notifications_.empty());