Fix win32 reading semaphore count not working (broke all queues)
authorsapier <Sapier at GMX dot net>
Tue, 14 Jan 2014 21:21:15 +0000 (22:21 +0100)
committersapier <Sapier at GMX dot net>
Wed, 15 Jan 2014 19:03:11 +0000 (20:03 +0100)
src/jthread/win32/jsemaphore.cpp

index 34167f391c4575b7eca61fb4caae13ee595f1a57..40623b13da5eb6ad25c73df594b985d2f2185eb4 100755 (executable)
@@ -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);
+       }
 }