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