windows-nt/Source/XPSP1/NT/com/rpc/runtime/mtrt/eventwrp.cxx

121 lines
2.4 KiB
C++
Raw Permalink Normal View History

2020-09-26 03:20:57 -05:00
//+-------------------------------------------------------------------------
//
// Microsoft Windows
//
// Copyright (C) Microsoft Corporation, 1998 - 1999
//
// File: eventwrp.cxx
//
//--------------------------------------------------------------------------
/* --------------------------------------------------------------------
Microsoft OS/2 LAN Manager
Copyright(c) Microsoft Corp., 1990
-------------------------------------------------------------------- */
/* --------------------------------------------------------------------
File: mutex.cxx
Description:
This file contains the system independent mutex class for NT.
History:
mikemon ??-??-?? The beginning.
mikemon 12-31-90 Upgraded the comments.
-------------------------------------------------------------------- */
#include <precomp.hxx>
EVENT::EVENT (
IN OUT RPC_STATUS PAPI * RpcStatus,
IN int ManualReset,
IN BOOL fDelayInit
)
{
EventHandle = NULL;
// DelayInit events are auto reset
ASSERT(ManualReset == FALSE || fDelayInit == FALSE);
if (!fDelayInit && *RpcStatus == RPC_S_OK )
{
EventHandle = CreateEvent(NULL, ManualReset, 0, NULL);
if ( EventHandle != NULL )
{
LogEvent(SU_EVENT, EV_CREATE, EventHandle, 0, 0, 1, 2);
*RpcStatus = RPC_S_OK;
}
else
{
*RpcStatus = RPC_S_OUT_OF_MEMORY;
}
}
}
EVENT::~EVENT (
)
{
if ( EventHandle )
{
LogEvent(SU_EVENT, EV_DELETE, EventHandle, 0, 0, 1, 2);
BOOL bResult;
bResult = CloseHandle(EventHandle);
ASSERT(bResult != 0);
}
}
int
EVENT::Wait (
long timeout
)
{
DWORD result;
if (NULL == EventHandle)
{
InitializeEvent();
}
result = WaitForSingleObject(EventHandle, timeout);
if (result == WAIT_TIMEOUT)
return(1);
return(0);
}
void
EVENT::InitializeEvent (
)
// Used when fDelayInit is TRUE in the c'tor.
{
if (EventHandle)
{
return;
}
HANDLE event = CreateEvent(0, FALSE, FALSE, 0);
if (event)
{
if (InterlockedCompareExchangePointer(&EventHandle, event, 0) != 0)
{
CloseHandle(event);
}
return;
}
// Can't allocate an event.
RpcRaiseException(RPC_S_OUT_OF_RESOURCES);
}