Fix win32 reading semaphore count not working (broke all queues)

This commit is contained in:
sapier 2014-01-14 22:21:15 +01:00
parent f42f01758c
commit 4896d4b829
1 changed files with 33 additions and 6 deletions

View File

@ -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);
}
}