92 lines
1.5 KiB
C++
92 lines
1.5 KiB
C++
|
/*++
|
||
|
|
||
|
Copyright (c) 1998 Microsoft Corporation
|
||
|
|
||
|
Module Name:
|
||
|
|
||
|
mutex.cpp
|
||
|
|
||
|
Abstract:
|
||
|
|
||
|
SIS Groveler named mutex class
|
||
|
|
||
|
Authors:
|
||
|
|
||
|
John Douceur, 1998
|
||
|
|
||
|
Environment:
|
||
|
|
||
|
User Mode
|
||
|
|
||
|
|
||
|
Revision History:
|
||
|
|
||
|
|
||
|
--*/
|
||
|
|
||
|
#include "all.hxx"
|
||
|
|
||
|
NamedMutex::NamedMutex(
|
||
|
const _TCHAR *name,
|
||
|
SECURITY_ATTRIBUTES *security_attributes)
|
||
|
{
|
||
|
ASSERT(this != 0);
|
||
|
mutex_handle = CreateMutex(security_attributes, FALSE, name);
|
||
|
if (mutex_handle == 0)
|
||
|
{
|
||
|
DWORD err = GetLastError();
|
||
|
PRINT_DEBUG_MSG((_T("GROVELER: CreateMutex() failed with error %d\n"), err));
|
||
|
}
|
||
|
}
|
||
|
|
||
|
NamedMutex::~NamedMutex()
|
||
|
{
|
||
|
ASSERT(this != 0);
|
||
|
if (mutex_handle != 0)
|
||
|
{
|
||
|
int ok = CloseHandle(mutex_handle);
|
||
|
if (!ok)
|
||
|
{
|
||
|
DWORD err = GetLastError();
|
||
|
PRINT_DEBUG_MSG((_T("GROVELER: CloseHandle() failed with error %d\n"), err));
|
||
|
}
|
||
|
mutex_handle = 0;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
bool
|
||
|
NamedMutex::release()
|
||
|
{
|
||
|
ASSERT(this != 0);
|
||
|
if (mutex_handle == 0)
|
||
|
{
|
||
|
return false;
|
||
|
}
|
||
|
BOOL ok = ReleaseMutex(mutex_handle);
|
||
|
if (!ok)
|
||
|
{
|
||
|
DWORD err = GetLastError();
|
||
|
PRINT_DEBUG_MSG((_T("GROVELER: ReleaseMutex() failed with error %d\n"), err));
|
||
|
}
|
||
|
return (ok != 0);
|
||
|
}
|
||
|
|
||
|
bool
|
||
|
NamedMutex::acquire(
|
||
|
unsigned int timeout)
|
||
|
{
|
||
|
ASSERT(this != 0);
|
||
|
if (mutex_handle == 0)
|
||
|
{
|
||
|
return false;
|
||
|
}
|
||
|
ASSERT(signed(timeout) >= 0);
|
||
|
DWORD result = WaitForSingleObject(mutex_handle, timeout);
|
||
|
if (result != WAIT_TIMEOUT && result != WAIT_OBJECT_0)
|
||
|
{
|
||
|
PRINT_DEBUG_MSG((_T("GROVELER: WaitForSingleObject() returned error %d\n"),
|
||
|
result));
|
||
|
}
|
||
|
return (result == WAIT_OBJECT_0);
|
||
|
}
|