utiles_v2017/lock.cpp

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