Windows NT 4.0 source code leak
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

187 lines
4.6 KiB

/*++
Copyright (c) 1989 Microsoft Corporation
Module Name:
wait.c
Abstract:
This module contains the primitives to implement the OS/2 Wait functions
Author:
Steve Wood (stevewo) 23-Oct-1989
Revision History:
--*/
#define INCL_OS2V20_ERRORS
#include "os2srv.h"
BOOLEAN
Os2InitializeWait(
IN OS2_WAIT_ROUTINE WaitRoutine,
IN POS2_THREAD WaitingThread,
IN OUT POS2_API_MSG WaitReplyMessage,
IN PVOID WaitParameter,
OUT POS2_WAIT_BLOCK *WaitBlockPtr
)
{
ULONG Length;
POS2_WAIT_BLOCK WaitBlock;
Length = sizeof( *WaitBlock ) - sizeof( WaitBlock->WaitReplyMessage ) +
WaitReplyMessage->h.u1.s1.TotalLength;
WaitBlock = RtlAllocateHeap( Os2Heap, 0, Length );
if (WaitBlock == NULL) {
WaitReplyMessage->ReturnedErrorValue = ERROR_NOT_ENOUGH_MEMORY;
return( FALSE );
}
WaitBlock->Length = Length;
WaitBlock->WaitingThread = WaitingThread;
WaitBlock->WaitParameter = WaitParameter;
WaitingThread->WaitBlock = WaitBlock;
WaitBlock->WaitRoutine = WaitRoutine;
InitializeListHead( &WaitBlock->UserLink );
InitializeListHead( &WaitBlock->Link );
RtlMoveMemory( &WaitBlock->WaitReplyMessage,
WaitReplyMessage,
WaitReplyMessage->h.u1.s1.TotalLength
);
*WaitBlockPtr = WaitBlock;
return TRUE;
}
BOOLEAN
Os2CreateWait(
IN OS2_WAIT_REASON WaitReason,
IN OS2_WAIT_ROUTINE WaitRoutine,
IN POS2_THREAD WaitingThread,
IN OUT POS2_API_MSG WaitReplyMessage,
IN PVOID WaitParameter,
IN PLIST_ENTRY UserLinkListHead OPTIONAL
)
{
POS2_WAIT_BLOCK WaitBlock;
ASSERT( WaitReason < MaxWaitReason );
if (WaitingThread->CurrentSignals != 0) {
WaitReplyMessage->ReturnedErrorValue = ERROR_INTERRUPT;
return( FALSE );
}
if (!Os2InitializeWait(WaitRoutine,
WaitingThread,
WaitReplyMessage,
WaitParameter,
&WaitBlock))
return FALSE;
InsertTailList( &Os2WaitLists[ WaitReason ], &WaitBlock->Link );
if ( ARGUMENT_PRESENT(UserLinkListHead) ) {
InsertTailList( UserLinkListHead, &WaitBlock->UserLink );
}
return( TRUE );
}
BOOLEAN
Os2NotifyWaitBlock(
IN POS2_WAIT_BLOCK WaitBlock,
IN OS2_WAIT_REASON WaitReason,
IN PVOID SatisfyParameter1,
IN PVOID SatisfyParameter2
)
{
if (WaitBlock == NULL){
#if DBG
DbgPrint("Os2NotifyWaitBlockRoutine - NULL Block\n");
#endif
return(FALSE);
}
if ((*WaitBlock->WaitRoutine)( WaitReason,
WaitBlock->WaitingThread,
&WaitBlock->WaitReplyMessage,
WaitBlock->WaitParameter,
SatisfyParameter1,
SatisfyParameter2
)
) {
if ( WaitBlock->Link.Flink ) {
RemoveEntryList( &WaitBlock->Link );
}
if ( WaitBlock->UserLink.Flink ) {
RemoveEntryList( &WaitBlock->UserLink );
}
WaitBlock->WaitingThread->WaitBlock = NULL;
// NtReplyPort( WaitBlock->WaitingThread->Process->ClientPort,
NtReplyPort( Os2SessionPort,
(PPORT_MESSAGE)&WaitBlock->WaitReplyMessage
);
RtlFreeHeap( Os2Heap, 0, WaitBlock );
return( TRUE );
} else {
return( FALSE );
}
}
BOOLEAN
Os2NotifyWait(
IN OS2_WAIT_REASON WaitReason,
IN PVOID SatisfyParameter1,
IN PVOID SatisfyParameter2
)
{
PLIST_ENTRY ListHead, ListNext;
POS2_WAIT_BLOCK WaitBlock;
BOOLEAN Result;
ASSERT( WaitReason < MaxWaitReason );
Result = FALSE;
ListHead = &Os2WaitLists[ WaitReason ];
ListNext = ListHead->Flink;
while (ListNext != ListHead) {
WaitBlock = CONTAINING_RECORD( ListNext, OS2_WAIT_BLOCK, Link );
ListNext = ListNext->Flink;
Result |= Os2NotifyWaitBlock( WaitBlock,
WaitReason,
SatisfyParameter1,
SatisfyParameter2
);
}
return( Result );
}
VOID
Os2DestroyWait(
IN POS2_WAIT_BLOCK WaitBlock
)
{
try {
WaitBlock->WaitingThread->WaitBlock = NULL;
RemoveEntryList( &WaitBlock->Link );
if ( WaitBlock->UserLink.Flink ) {
RemoveEntryList( &WaitBlock->UserLink );
}
RtlFreeHeap( Os2Heap, 0, WaitBlock );
} except( EXCEPTION_EXECUTE_HANDLER ) {
return;
}
}