mirror of
https://github.com/reactos/reactos.git
synced 2024-12-28 10:04:49 +00:00
correct bug in release of semaphore
svn path=/trunk/; revision=356
This commit is contained in:
parent
3763d9c0dd
commit
d7acbe2251
1 changed files with 13 additions and 21 deletions
|
@ -24,7 +24,7 @@ VOID KeInitializeSemaphore(PKSEMAPHORE Semaphore,
|
||||||
KeInitializeDispatcherHeader(&Semaphore->Header,SemaphoreType,
|
KeInitializeDispatcherHeader(&Semaphore->Header,SemaphoreType,
|
||||||
sizeof(KSEMAPHORE)/sizeof(ULONG),
|
sizeof(KSEMAPHORE)/sizeof(ULONG),
|
||||||
Count);
|
Count);
|
||||||
Semaphore->Limit = Limit;
|
Semaphore->Limit=Limit;
|
||||||
}
|
}
|
||||||
|
|
||||||
LONG KeReadStateSemaphore(PKSEMAPHORE Semaphore)
|
LONG KeReadStateSemaphore(PKSEMAPHORE Semaphore)
|
||||||
|
@ -37,26 +37,18 @@ LONG KeReleaseSemaphore(PKSEMAPHORE Semaphore,
|
||||||
LONG Adjustment,
|
LONG Adjustment,
|
||||||
BOOLEAN Wait)
|
BOOLEAN Wait)
|
||||||
{
|
{
|
||||||
ULONG initState = Semaphore->Header.SignalState;
|
ULONG initState = Semaphore->Header.SignalState;
|
||||||
|
KeAcquireDispatcherDatabaseLock(Wait);
|
||||||
KeAcquireDispatcherDatabaseLock(Wait);
|
if(Semaphore->Limit < initState+Adjustment
|
||||||
|
|
||||||
if(Semaphore->Limit < initState+Adjustment
|
|
||||||
|| initState > initState+Adjustment)
|
|| initState > initState+Adjustment)
|
||||||
{
|
ExRaiseStatus(STATUS_SEMAPHORE_LIMIT_EXCEEDED);
|
||||||
ExRaiseStatus(STATUS_SEMAPHORE_LIMIT_EXCEEDED);
|
Semaphore->Header.SignalState+=Adjustment;
|
||||||
}
|
if(initState == 0)
|
||||||
|
{
|
||||||
Semaphore->Header.SignalState += Adjustment;
|
// wake up SignalState waiters
|
||||||
if (initState == 0)
|
KeDispatcherObjectWake(&Semaphore->Header) ;
|
||||||
{
|
}
|
||||||
// wake up SignalState waiters
|
KeReleaseDispatcherDatabaseLock(Wait);
|
||||||
while(Semaphore->Header.SignalState > 0
|
return initState;
|
||||||
&& KeDispatcherObjectWake(&Semaphore->Header)) ;
|
|
||||||
}
|
|
||||||
|
|
||||||
KeReleaseDispatcherDatabaseLock(Wait);
|
|
||||||
|
|
||||||
return initState;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue