diff options
author | Toni Uhlig <matzeton@googlemail.com> | 2025-08-14 18:40:01 +0200 |
---|---|---|
committer | Toni Uhlig <matzeton@googlemail.com> | 2025-08-14 18:41:41 +0200 |
commit | dbd7cfa7f406334e80ef80ddd962d5619b045ff9 (patch) | |
tree | ff39aea4aed8f3cf3601050a2fdcf5c5de8b600f | |
parent | d9ed004d0928567ab822d2b96862c33454e2e1c7 (diff) |
Improved Thread/Semaphore/Event timeout handling (new default: return immediately instead of waiting indefinitely)HEADmain
Signed-off-by: Toni Uhlig <matzeton@googlemail.com>
-rw-r--r-- | CRT/DriverThread.cpp | 8 | ||||
-rw-r--r-- | CRT/DriverThread.hpp | 6 |
2 files changed, 8 insertions, 6 deletions
diff --git a/CRT/DriverThread.cpp b/CRT/DriverThread.cpp index 3a77dc8..557b270 100644 --- a/CRT/DriverThread.cpp +++ b/CRT/DriverThread.cpp @@ -56,6 +56,7 @@ NTSTATUS DriverThread::Thread::Start(ThreadRoutine routine, eastl::shared_ptr<Th if (!NT_SUCCESS(status)) { + threadHandle = nullptr; return status; } @@ -64,6 +65,7 @@ NTSTATUS DriverThread::Thread::Start(ThreadRoutine routine, eastl::shared_ptr<Th if (!NT_SUCCESS(status)) { + threadHandle = nullptr; return status; } @@ -85,7 +87,7 @@ NTSTATUS DriverThread::Thread::WaitForTermination(LONGLONG timeout) LARGE_INTEGER li_timeout = {.QuadPart = timeout}; NTSTATUS status = - KeWaitForSingleObject(m_threadObject, Executive, KernelMode, FALSE, (timeout == 0 ? NULL : &li_timeout)); + KeWaitForSingleObject(m_threadObject, Executive, KernelMode, FALSE, &li_timeout); ObDereferenceObject(m_threadObject); m_threadObject = nullptr; @@ -124,7 +126,7 @@ DriverThread::Semaphore::Semaphore(LONG initialValue, LONG maxValue) NTSTATUS DriverThread::Semaphore::Wait(LONGLONG timeout) { LARGE_INTEGER li_timeout = {.QuadPart = timeout}; - return KeWaitForSingleObject(&m_semaphore, Executive, KernelMode, FALSE, (timeout == 0 ? NULL : &li_timeout)); + return KeWaitForSingleObject(&m_semaphore, Executive, KernelMode, FALSE, &li_timeout); } LONG DriverThread::Semaphore::Release(LONG adjustment) @@ -142,7 +144,7 @@ DriverThread::Event::Event() NTSTATUS DriverThread::Event::Wait(LONGLONG timeout) { LARGE_INTEGER li_timeout = {.QuadPart = timeout}; - return KeWaitForSingleObject(&m_event, Executive, KernelMode, FALSE, (timeout == 0 ? NULL : &li_timeout)); + return KeWaitForSingleObject(&m_event, Executive, KernelMode, FALSE, &li_timeout); } NTSTATUS DriverThread::Event::Notify() diff --git a/CRT/DriverThread.hpp b/CRT/DriverThread.hpp index ac2eddd..f5fdd22 100644 --- a/CRT/DriverThread.hpp +++ b/CRT/DriverThread.hpp @@ -57,7 +57,7 @@ public: Thread(const Thread &) = delete; ~Thread(void); NTSTATUS Start(ThreadRoutine routine, eastl::shared_ptr<ThreadArgs> args); - NTSTATUS WaitForTermination(LONGLONG timeout = 0); + NTSTATUS WaitForTermination(LONGLONG timeout = -1); HANDLE GetThreadId(void) { return m_threadId; @@ -94,7 +94,7 @@ class Semaphore { public: Semaphore(LONG initialValue = 0, LONG maxValue = MAXLONG); - NTSTATUS Wait(LONGLONG timeout = 0); + NTSTATUS Wait(LONGLONG timeout = -1); LONG Release(LONG adjustment = 1); private: @@ -105,7 +105,7 @@ class Event { public: Event(); - NTSTATUS Wait(LONGLONG timeout = 0); + NTSTATUS Wait(LONGLONG timeout = -1); NTSTATUS Notify(); private: |