98 lines
2.1 KiB
C++
98 lines
2.1 KiB
C++
#include "StdAfx.h"
|
|
#include "lock.h"
|
|
//************************************************************************************************
|
|
Clock::Clock(void)
|
|
{
|
|
cerrojo=CLOCK_ESTADO_DESBLOQUEADO;
|
|
cliente=0;
|
|
t_sleep=25;
|
|
modo=1;
|
|
if (!InitializeCriticalSectionAndSpinCount(&cerrojo1, 0x00000400) )
|
|
modo=0;
|
|
|
|
}
|
|
//************************************************************************************************
|
|
Clock::~Clock(void)
|
|
{
|
|
if (modo)
|
|
DeleteCriticalSection(&cerrojo1);
|
|
}
|
|
//************************************************************************************************
|
|
void Clock::entro()
|
|
{
|
|
if (modo)
|
|
{
|
|
while(TRUE)
|
|
{
|
|
try
|
|
{
|
|
EnterCriticalSection(&cerrojo1);
|
|
return;
|
|
}
|
|
catch (CException* e)
|
|
{
|
|
e->Delete();
|
|
Sleep(t_sleep);
|
|
}
|
|
}
|
|
return;
|
|
}
|
|
long iden = GetCurrentThreadId();
|
|
long cerrojo_ = InterlockedExchange(&cerrojo,CLOCK_ESTADO_BLOQUEADO);
|
|
while (cerrojo_ != CLOCK_ESTADO_DESBLOQUEADO)
|
|
{
|
|
if (iden==cliente)
|
|
{
|
|
break;
|
|
}
|
|
Sleep(t_sleep);
|
|
cerrojo_ = InterlockedExchange(&cerrojo,CLOCK_ESTADO_BLOQUEADO);
|
|
}
|
|
cliente=iden;
|
|
}
|
|
//************************************************************************************************
|
|
void Clock::salgo()
|
|
{
|
|
if (modo)
|
|
{
|
|
LeaveCriticalSection(&cerrojo1);
|
|
return;
|
|
}
|
|
if (cliente==GetCurrentThreadId())
|
|
{
|
|
cliente=0;
|
|
InterlockedExchange(&cerrojo,CLOCK_ESTADO_DESBLOQUEADO);
|
|
}
|
|
}
|
|
//************************************************************************************************
|
|
BOOL Clock::puedo()
|
|
{
|
|
if (modo)
|
|
{
|
|
return TryEnterCriticalSection(&cerrojo1);
|
|
}
|
|
long iden = GetCurrentThreadId();
|
|
long cerrojo_ = InterlockedExchange(&cerrojo,CLOCK_ESTADO_BLOQUEADO);
|
|
if (cerrojo != CLOCK_ESTADO_DESBLOQUEADO)
|
|
{
|
|
if (iden!=cliente)
|
|
{
|
|
return FALSE;
|
|
}
|
|
}
|
|
cliente=iden;
|
|
return TRUE;
|
|
}
|
|
//************************************************************************************************************************
|
|
long lck_sum_atm(long *n, int i)
|
|
{
|
|
long old;
|
|
do
|
|
{
|
|
old = *n;
|
|
if (old == InterlockedCompareExchange(n, old + i, old))
|
|
return old+i;
|
|
Sleep(1);
|
|
} while (TRUE);
|
|
}
|
|
//************************************************************************************************
|