From 4896d4b829d5e980dd3da586d7d713209ed72e89 Mon Sep 17 00:00:00 2001
From: sapier <Sapier at GMX dot net>
Date: Tue, 14 Jan 2014 22:21:15 +0100
Subject: [PATCH] Fix win32 reading semaphore count not working (broke all
 queues)

---
 src/jthread/win32/jsemaphore.cpp | 39 +++++++++++++++++++++++++++-----
 1 file 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);
+	}
 }