// ¸î°¡Áö ½Ã½ºÅÛ ÄÝÀÇ ¼º´ÉÀÌ ¸¶À½¿¡ ¾Èµé¾î¼­ µð½º¾î¼Àºí ÇØ¼­ ¿øÇϴ°͸¸ »Ì¾Æ³¿. // // by Testors 2004/03/12 #pragma once inline void break_point() { __asm { int 3 } } inline int is_debugger_present() { __asm { mov eax,dword ptr fs:[00000018h] mov eax,dword ptr [eax+30h] movzx eax,byte ptr [eax+2] } } inline int interlocked_increment( volatile int * target, int count = 1 ) { __asm { mov ebx, target mov eax, count lock xadd dword ptr [ebx],eax } } inline int interlocked_decrement( volatile int * target, int count = 1 ) { __asm { mov ebx, target mov eax, count neg eax lock xadd dword ptr [ebx],eax } } inline int interlocked_exchange( volatile int * target, int value ) { __asm { mov ebx, target mov eax, value lock xchg dword ptr [ebx],eax } } inline unsigned __int64 getElapsedPicoSecond() { __asm { mov edx,dword ptr ds:7FFE000Ch mov eax,dword ptr ds:7FFE0008h } } inline unsigned int getElapsedMilliSecond() { return static_cast< unsigned int >( getElapsedPicoSecond()/(long)10000 ); } inline unsigned __int64 getRDTSC() { __asm { rdtsc } } inline void spinlock_init( volatile int * lock ) { *lock = 0; } inline void spinlock_enter( volatile int * lock ) { enter: if( interlocked_exchange( lock, 1 ) == 0 ) return; goto enter; } inline void spinlock_leave( volatile int * lock ) { interlocked_exchange( lock, 0 ); } inline bool spinlock_tryenter( volatile int * lock ) { if( interlocked_exchange( lock, 1 ) == 0 ) return true; return false; }