Fix win32 reading semaphore count not working (broke all queues)
parent
f42f01758c
commit
4896d4b829
|
@ -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() {
|
int JSemaphore::GetValue() {
|
||||||
|
SEMAPHORE_BASIC_INFORMATION BasicInfo;
|
||||||
|
LONG retval;
|
||||||
|
|
||||||
long int retval = 0;
|
assert(NtQuerySemaphore);
|
||||||
ReleaseSemaphore(
|
|
||||||
m_hSemaphore,
|
|
||||||
0,
|
|
||||||
&retval);
|
|
||||||
|
|
||||||
return retval;
|
retval = NtQuerySemaphore (m_hSemaphore, 0,
|
||||||
|
&BasicInfo, sizeof (SEMAPHORE_BASIC_INFORMATION), NULL);
|
||||||
|
|
||||||
|
if (retval == ERROR_SUCCESS)
|
||||||
|
{
|
||||||
|
return BasicInfo.CurrentCount;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
assert("unable to read semaphore count" == 0);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue