aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorToni Uhlig <matzeton@googlemail.com>2025-08-14 18:40:01 +0200
committerToni Uhlig <matzeton@googlemail.com>2025-08-14 18:41:41 +0200
commitdbd7cfa7f406334e80ef80ddd962d5619b045ff9 (patch)
treeff39aea4aed8f3cf3601050a2fdcf5c5de8b600f
parentd9ed004d0928567ab822d2b96862c33454e2e1c7 (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.cpp8
-rw-r--r--CRT/DriverThread.hpp6
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: