// 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;
}