121 lines
2.4 KiB
C++
121 lines
2.4 KiB
C++
//+-------------------------------------------------------------------------
|
||
//
|
||
// 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);
|
||
}
|