// Common, group WinWrap
// see CW Semaphore
// Copyright Alexander Liss
#include "semaphore.h"
Semaphore::Semaphore( int nInitialCount, int nMaximumCount, LPCTSTR lpName, LPSECURITY_ATTRIBUTES lpSA) :
attributes(1)
{
handle = ::CreateSemaphore( lpSA, nInitialCount, nMaximumCount, lpName);
if (is_valid_handle(handle))
{
if (lpName)
{
DWORD g = GetLastError();
if(g == ERROR_ALREADY_EXISTS)
attributes &=~(DWORD)1;
}
status = NO_ERROR;
}
else
status = GetLastError();
}
Semaphore::Semaphore( LPCTSTR lpName, BOOL bInheritHandle, DWORD dwDesiredAccess):
attributes(0)
{
handle = ::OpenSemaphore( dwDesiredAccess, bInheritHandle, lpName);
if (is_valid_handle(handle))
status = NO_ERROR;
else
status = GetLastError();
}
BOOL Semaphore::release( LONG& previousCount, LONG lReleaseCount)
{
if(!is_valid_handle(handle)) return FALSE;
LONG previous;
BOOL success = ::ReleaseSemaphore( handle, lReleaseCount, &previous);
if (success)
previousCount = previous;
return success;
}