summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rwxr-xr-xsrc/jthread/win32/jsemaphore.cpp39
1 files changed, 33 insertions, 6 deletions
diff --git a/src/jthread/win32/jsemaphore.cpp b/src/jthread/win32/jsemaphore.cpp
index 34167f391..40623b13d 100755
--- a/src/jthread/win32/jsemaphore.cpp
+++ b/src/jthread/win32/jsemaphore.cpp
@@ -66,14 +66,41 @@ bool JSemaphore::Wait(unsigned int time_ms) {
}
}
+typedef LONG (NTAPI *_NtQuerySemaphore)(
+ HANDLE SemaphoreHandle,
+ DWORD SemaphoreInformationClass,
+ PVOID SemaphoreInformation,
+ ULONG SemaphoreInformationLength,
+ PULONG ReturnLength OPTIONAL
+);
+
+typedef struct _SEMAPHORE_BASIC_INFORMATION {
+ ULONG CurrentCount;
+ ULONG MaximumCount;
+} SEMAPHORE_BASIC_INFORMATION;
+
+/* Note: this will only work as long as jthread is directly linked to application */
+/* it's gonna fail if someone tries to build jthread as dll */
+static _NtQuerySemaphore NtQuerySemaphore =
+ (_NtQuerySemaphore)
+ GetProcAddress
+ (GetModuleHandle ("ntdll.dll"), "NtQuerySemaphore");
+
int JSemaphore::GetValue() {
+ SEMAPHORE_BASIC_INFORMATION BasicInfo;
+ LONG retval;
- long int retval = 0;
- ReleaseSemaphore(
- m_hSemaphore,
- 0,
- &retval);
+ assert(NtQuerySemaphore);
+
+ retval = NtQuerySemaphore (m_hSemaphore, 0,
+ &BasicInfo, sizeof (SEMAPHORE_BASIC_INFORMATION), NULL);
- return retval;
+ if (retval == ERROR_SUCCESS)
+ {
+ return BasicInfo.CurrentCount;
+ }
+ else {
+ assert("unable to read semaphore count" == 0);
+ }
}