Exemplo n.º 1
0
long InterlockedExchange(long volatile* Target, long Value) {
    bool success = false;
    long oldValue;

    while (!success) {
        oldValue = *Target;
        success = OSAtomicCompareAndSwap32(static_cast<int32_t>(oldValue),
                                           static_cast<int32_t>(Value),
                                           reinterpret_cast<int32_t volatile*>(Target));
    }

    return oldValue;
}
Exemplo n.º 2
0
unsigned
Atomic::exchange(unsigned value)
{
#if defined(_OPENTHREADS_ATOMIC_USE_GCC_BUILTINS)
    return __sync_lock_test_and_set(&_value, value);
#elif defined(_OPENTHREADS_ATOMIC_USE_WIN32_INTERLOCKED)
    return InterlockedExchange(&_value, value);
#elif defined(_OPENTHREADS_ATOMIC_USE_BSD_ATOMIC)
    return OSAtomicCompareAndSwap32(_value, value, &_value);
#else
# error This implementation should happen inline in the include file
#endif
}
Exemplo n.º 3
0
static inline int dInterlockedExchange (int* spin, int testValue)
{
	#if (defined (_POSIX_VER))
		return __sync_val_compare_and_swap((int32_t*)spin, !testValue, testValue);
	#endif

	#if (defined (_MAC_VER))
		return !OSAtomicCompareAndSwap32(!testValue, testValue, (int32_t*) spin);
	#endif

	#if (defined (_MSC_VER))
		return InterlockedExchange ((long*) spin, testValue);
	#endif
}
Exemplo n.º 4
0
inline bool compare_and_swap(volatile Node*volatile *target, volatile Node *comperand, volatile Node * exchange){
#ifdef _WIN32
        return InterlockedCompareExchangePointer((volatile PVOID*)target, (volatile PVOID)exchange, (volatile PVOID)comperand)==comperand;
#else
#ifdef __APPLE__
        if (sizeof(exchange)==4) {
            return OSAtomicCompareAndSwap32((int32_t)comperand, (int32_t)exchange, (int32_t*)target);
        }else {
            return OSAtomicCompareAndSwap64((int64_t)comperand, (int64_t)exchange, (int64_t*)target);
        }
#else
        return __sync_bool_compare_and_swap (target, comperand, exchange);
#endif
#endif
}
Exemplo n.º 5
0
static inline void dgSpinLock(dgInt32 *spin)
{
#ifdef _WIN32
  while (InterlockedExchange((long*) spin, 1))
  {
    Sleep(0);
  }
#elif defined (__APPLE__)
#ifndef TARGET_OS_IPHONE
  while( ! OSAtomicCompareAndSwap32(0, 1, (int32_t*) spin) )
  {
    sched_yield();
  }
#endif
#else
  while(! __sync_bool_compare_and_swap((int32_t*)spin, 0, 1) )
  {
    sched_yield();
  }
#endif
}
Exemplo n.º 6
0
static bool atomic_cas(sp_counted_base_atomic_type volatile *pw,int old_value,int new_value)
{
    // Older versions get non-volatile parameter
    return OSAtomicCompareAndSwap32(old_value,new_value,const_cast<int32_t *>(&pw->i));
}
Exemplo n.º 7
0
        void Init( void )
        {
            #ifdef _WIN32
            
            char       * common;
            std::string  apple;
            HMODULE      objc;
            HMODULE      foundation;

            if( InterlockedCompareExchange( reinterpret_cast< volatile LONG * >( &inited ), 1, 0 ) != 0 )
            {
                return;
            }

            #ifdef _WIN64
            common = nullptr;
            #else
            common = getenv( "COMMONPROGRAMFILES(x86)" );
            #endif

            if( common == nullptr )
            {
                common = getenv( "COMMONPROGRAMFILES" );
            }
            
            apple = std::string( common ) + "\\Apple\\Apple Application Support";

            SetDllDirectoryA( apple.c_str() );

            objc       = LoadLibraryA( ( apple + "\\objc.dll" ).c_str() );
            foundation = LoadLibraryA( ( apple + "\\Foundation.dll" ).c_str() );

            if( objc == nullptr || foundation == nullptr )
            {
                return;
            }
            
            Internal::objc_getClass               = ( Class        ( * )( const char * )                                       )GetProcAddress( objc, "objc_getClass" );
            Internal::objc_getMetaClass           = ( Class        ( * )( const char * )                                       )GetProcAddress( objc, "objc_getMetaClass" );
            Internal::objc_getProtocol            = ( Protocol *   ( * )( const char * )                                       )GetProcAddress( objc, "objc_getProtocol" );
            Internal::objc_msgSend                = ( id           ( * )( id, SEL, ... )                                       )GetProcAddress( objc, "objc_msgSend" );
            Internal::objc_msgSend_fpret          = ( double       ( * )( id, SEL, ... )                                       )GetProcAddress( objc, "objc_msgSend_fpret" );
            Internal::objc_msgSend_stret          = ( void         ( * )( void *, id, SEL, ... )                               )GetProcAddress( objc, "objc_msgSend_stret" );
            Internal::objc_msgSendSuper           = ( id           ( * )( struct objc_super *, SEL, ... )                      )GetProcAddress( objc, "objc_msgSendSuper" );
            Internal::objc_allocateClassPair      = ( Class        ( * )( Class, const char *, size_t )                        )GetProcAddress( objc, "objc_allocateClassPair" );
            Internal::objc_registerClassPair      = ( void         ( * )( Class )                                              )GetProcAddress( objc, "objc_registerClassPair" );
            Internal::sel_registerName            = ( SEL          ( * )( const char * )                                       )GetProcAddress( objc, "sel_registerName" );
            Internal::sel_getName                 = ( const char * ( * )( SEL )                                                )GetProcAddress( objc, "sel_getName" );
            Internal::object_getClass             = ( Class        ( * )( id )                                                 )GetProcAddress( objc, "object_getClass" );
            Internal::method_getImplementation    = ( IMP          ( * )( Method )                                             )GetProcAddress( objc, "method_getImplementation" );
            Internal::method_getName              = ( SEL          ( * )( Method )                                             )GetProcAddress( objc, "method_getName" );
            Internal::class_getSuperclass         = ( Class        ( * )( Class )                                              )GetProcAddress( objc, "class_getSuperclass" );
            Internal::class_getName               = ( const char * ( * )( Class )                                              )GetProcAddress( objc, "class_getName" );
            Internal::class_copyMethodList        = ( Method     * ( * )( Class, unsigned int * )                              )GetProcAddress( objc, "class_copyMethodList" );
            Internal::class_addIvar               = ( bool         ( * )( Class, const char *, size_t, uint8_t, const char * ) )GetProcAddress( objc, "class_addIvar" );
            Internal::class_addMethod             = ( bool         ( * )( Class, SEL, IMP, const char * )                      )GetProcAddress( objc, "class_addMethod" );
            Internal::class_addProtocol           = ( bool         ( * )( Class, Protocol * )                                  )GetProcAddress( objc, "class_addProtocol" );
            Internal::class_getInstanceVariable   = ( Ivar         ( * )( Class, const char * )                                )GetProcAddress( objc, "class_getInstanceVariable" );
            Internal::ivar_getOffset              = ( ptrdiff_t    ( * )( Ivar )                                               )GetProcAddress( objc, "ivar_getOffset" );
            Internal::NSLogv                      = ( void         ( * )( id, va_list )                                        )GetProcAddress( foundation, "NSLogv" );
            
            #else
            
            if( OSAtomicCompareAndSwap32( 0, 1, &inited ) == false )
            {
                return;
            }
            
            Internal::objc_getClass               = ::objc_getClass;
            Internal::objc_getMetaClass           = ::objc_getMetaClass;
            Internal::objc_getProtocol            = ::objc_getProtocol;
            Internal::objc_msgSend                = ::objc_msgSend;
            Internal::objc_msgSend_fpret          = ::objc_msgSend_fpret;
            Internal::objc_msgSend_stret          = ::objc_msgSend_stret;
            Internal::objc_msgSendSuper           = ::objc_msgSendSuper;
            Internal::objc_allocateClassPair      = ::objc_allocateClassPair;
            Internal::objc_registerClassPair      = ::objc_registerClassPair;
            Internal::sel_registerName            = ::sel_registerName;
            Internal::sel_getName                 = ::sel_getName;
            Internal::object_getClass             = ::object_getClass;
            Internal::method_getImplementation    = ::method_getImplementation;
            Internal::method_getName              = ::method_getName;
            Internal::class_getSuperclass         = ::class_getSuperclass;
            Internal::class_getName               = ::class_getName;
            Internal::class_copyMethodList        = ::class_copyMethodList;
            Internal::class_addIvar               = ::class_addIvar;
            Internal::class_addMethod             = ::class_addMethod;
            Internal::class_addProtocol           = ::class_addProtocol;
            Internal::class_getInstanceVariable   = ::class_getInstanceVariable;
            Internal::ivar_getOffset              = ::ivar_getOffset;
            Internal::NSLogv                      = ::NSLogv;
            
            #endif
        }
Exemplo n.º 8
0
int TS_AtomicCAS(TS_Atomic32 * aToSwap, int32_t aIfEqualTo, int32_t aTo){
    return OSAtomicCompareAndSwap32(aIfEqualTo, aTo, aToSwap);
}
Exemplo n.º 9
0
void TS_AtomicSet(TS_Atomic32 * aToSet, int32_t aTo){
    // High level spinlock.
    while(!OSAtomicCompareAndSwap32(TS_AtomicGet(aToSet), aTo, aToSet)){}
}