[Kernel/IO] IoCompletion: Removed !wait_ticks check

- Marked IoCompletion as frequently used functions
- Added correct behaviour to wait_ticks 0
This commit is contained in:
Gliniak 2021-01-25 08:49:48 +01:00 committed by Rick Gibbed
parent 771f8fb292
commit 14eeb94326
2 changed files with 8 additions and 4 deletions

View File

@ -458,7 +458,8 @@ dword_result_t NtSetIoCompletion(dword_t handle, dword_t key_context,
port->QueueNotification(notification); port->QueueNotification(notification);
return X_STATUS_SUCCESS; return X_STATUS_SUCCESS;
} }
DECLARE_XBOXKRNL_EXPORT1(NtSetIoCompletion, kFileSystem, kImplemented); DECLARE_XBOXKRNL_EXPORT2(NtSetIoCompletion, kFileSystem, kImplemented,
kHighFrequency);
// Dequeues a packet from the completion port. // Dequeues a packet from the completion port.
dword_result_t NtRemoveIoCompletion( dword_result_t NtRemoveIoCompletion(
@ -473,7 +474,9 @@ dword_result_t NtRemoveIoCompletion(
status = X_STATUS_INVALID_HANDLE; status = X_STATUS_INVALID_HANDLE;
} }
uint64_t timeout_ticks = timeout ? static_cast<uint32_t>(*timeout) : 0u; uint64_t timeout_ticks =
timeout ? static_cast<uint32_t>(*timeout)
: static_cast<uint64_t>(std::numeric_limits<int64_t>::min());
XIOCompletion::IONotification notification; XIOCompletion::IONotification notification;
if (port->WaitForNotification(timeout_ticks, &notification)) { if (port->WaitForNotification(timeout_ticks, &notification)) {
if (key_context) { if (key_context) {
@ -493,7 +496,8 @@ dword_result_t NtRemoveIoCompletion(
return status; return status;
} }
DECLARE_XBOXKRNL_EXPORT1(NtRemoveIoCompletion, kFileSystem, kImplemented); DECLARE_XBOXKRNL_EXPORT2(NtRemoveIoCompletion, kFileSystem, kImplemented,
kHighFrequency);
dword_result_t NtQueryFullAttributesFile( dword_result_t NtQueryFullAttributesFile(
pointer_t<X_OBJECT_ATTRIBUTES> obj_attribs, pointer_t<X_OBJECT_ATTRIBUTES> obj_attribs,

View File

@ -30,7 +30,7 @@ bool XIOCompletion::WaitForNotification(uint64_t wait_ticks,
IONotification* notify) { IONotification* notify) {
auto ms = std::chrono::milliseconds(TimeoutTicksToMs(wait_ticks)); auto ms = std::chrono::milliseconds(TimeoutTicksToMs(wait_ticks));
auto res = threading::Wait(notification_semaphore_.get(), false, ms); auto res = threading::Wait(notification_semaphore_.get(), false, ms);
if (res == threading::WaitResult::kSuccess || !wait_ticks) { if (res == threading::WaitResult::kSuccess) {
std::unique_lock<std::mutex> lock(notification_lock_); std::unique_lock<std::mutex> lock(notification_lock_);
assert_false(notifications_.empty()); assert_false(notifications_.empty());