{
PrevBlock->NextWaitBlock = current->NextWaitBlock;
}
+ current->NextWaitBlock = NULL;
+ /* if the last block is the timeout block then remove this block */
+ PrevBlock = current->Thread->WaitBlockList;
+ if (PrevBlock == ¤t->Thread->WaitBlock[3] && PrevBlock->NextWaitBlock == NULL)
+ {
+ RemoveEntryList(¤t->Thread->WaitBlock[3].WaitListEntry);
+ current->Thread->WaitBlockList = NULL;
+ }
}
}
KiSideEffectsBeforeWake(hdr, current->Thread, &Abandoned);
PrevBlock->NextWaitBlock = current->NextWaitBlock;
}
}
+ current->NextWaitBlock = NULL;
+ /* if the last block is the timeout block then remove this block */
+ PrevBlock = current->Thread->WaitBlockList;
+ if (PrevBlock == ¤t->Thread->WaitBlock[3] && PrevBlock->NextWaitBlock == NULL)
+ {
+ RemoveEntryList(¤t->Thread->WaitBlock[3].WaitListEntry);
+ current->Thread->WaitBlockList = NULL;
+ }
}
DPRINT("Waking %x\n",current->Thread);
Status = current->WaitKey;
if (Abandoned)
Status += STATUS_ABANDONED_WAIT_0;
- PsUnblockThread(CONTAINING_RECORD(current->Thread, ETHREAD, Tcb),
- &Status);
+ if (current->Thread->WaitBlockList == NULL)
+ {
+ PsUnblockThread(CONTAINING_RECORD(current->Thread,ETHREAD,Tcb),
+ &Status);
+ }
return(TRUE);
}
*/
if (KiIsObjectSignalled(hdr, CurrentThread, &Abandoned))
{
- KeReleaseDispatcherDatabaseLock(FALSE);
if (Timeout != NULL)
{
- KeCancelTimer(&KeGetCurrentThread()->Timer);
+ KeCancelTimer(&CurrentThread->Timer);
}
+ KeReleaseDispatcherDatabaseLock(FALSE);
if (Abandoned == TRUE)
return(STATUS_ABANDONED_WAIT_0);
return(STATUS_WAIT_0);
if (Timeout != NULL &&
KiIsObjectSignalled(&CurrentThread->Timer.Header, CurrentThread, NULL))
{
+ KeCancelTimer(&CurrentThread->Timer);
KeReleaseDispatcherDatabaseLock(FALSE);
- if (Timeout != NULL)
- {
- KeCancelTimer(&KeGetCurrentThread()->Timer);
- }
return(STATUS_TIMEOUT);
}
if (Timeout != NULL)
{
CurrentThread->WaitBlock[0].NextWaitBlock =
- &CurrentThread->WaitBlock[1];
- CurrentThread->WaitBlock[1].Object = (PVOID)&CurrentThread->Timer;
- CurrentThread->WaitBlock[1].Thread = CurrentThread;
- CurrentThread->WaitBlock[1].WaitKey = STATUS_TIMEOUT;
- CurrentThread->WaitBlock[1].WaitType = WaitAny;
- CurrentThread->WaitBlock[1].NextWaitBlock = NULL;
+ &CurrentThread->WaitBlock[3];
+ CurrentThread->WaitBlock[3].Object = (PVOID)&CurrentThread->Timer;
+ CurrentThread->WaitBlock[3].Thread = CurrentThread;
+ CurrentThread->WaitBlock[3].WaitKey = STATUS_TIMEOUT;
+ CurrentThread->WaitBlock[3].WaitType = WaitAny;
+ CurrentThread->WaitBlock[3].NextWaitBlock = NULL;
InsertTailList(&CurrentThread->Timer.Header.WaitListHead,
- &CurrentThread->WaitBlock[1].WaitListEntry);
+ &CurrentThread->WaitBlock[3].WaitListEntry);
}
else
{
if (Timeout != NULL)
{
- KeCancelTimer(&KeGetCurrentThread()->Timer);
+ KeCancelTimer(&CurrentThread->Timer);
}
DPRINT("Returning from KeWaitForSingleObject()\n");
__FILE__,__LINE__);
return(STATUS_UNSUCCESSFUL);
}
- blk = &CurrentThread->WaitBlock[0];
+ WaitBlockArray = &CurrentThread->WaitBlock[0];
}
else
{
__FILE__,__LINE__);
return(STATUS_UNSUCCESSFUL);
}
- blk = WaitBlockArray;
}
/*
if (WaitType == WaitAny)
{
+ if (Timeout != NULL)
+ {
+ KeCancelTimer(&CurrentThread->Timer);
+ }
KeReleaseDispatcherDatabaseLock(FALSE);
DPRINT("One object is already signaled!\n");
if (Abandoned == TRUE)
if ((WaitType == WaitAll) && (CountSignaled == Count))
{
+ if (Timeout != NULL)
+ {
+ KeCancelTimer(&CurrentThread->Timer);
+ }
KeReleaseDispatcherDatabaseLock(FALSE);
DPRINT("All objects are already signaled!\n");
return(STATUS_WAIT_0);
if (Timeout != NULL &&
KiIsObjectSignalled(&CurrentThread->Timer.Header, CurrentThread, NULL))
{
+ KeCancelTimer(&CurrentThread->Timer);
KeReleaseDispatcherDatabaseLock(FALSE);
- if (Timeout != NULL)
- {
- KeCancelTimer(&KeGetCurrentThread()->Timer);
- }
return(STATUS_TIMEOUT);
}
/* Append wait block to the KTHREAD wait block list */
- CurrentThread->WaitBlockList = blk;
+ CurrentThread->WaitBlockList = blk = WaitBlockArray;
/*
* Set up the wait
*/
+ CurrentThread->WaitStatus = STATUS_UNSUCCESSFUL;
for (i = 0; i < Count; i++)
{
hdr = (DISPATCHER_HEADER *)Object[i];
if (Timeout != NULL)
{
- KeCancelTimer(&KeGetCurrentThread()->Timer);
+ KeCancelTimer(&CurrentThread->Timer);
}
DPRINT("Returning from KeWaitForMultipleObjects()\n");