@ -1,4 +1,4 @@
# C h e c k f o r a v a i l a b i l i t y o f a t o m i c o p e r a t i o n s
# C h e c k f o r a v a i l a b i l i t y o f a t o m i c o p e r a t i o n s
# T h i s m o d u l e d e f i n e s
# O P E N T H R E A D S _ H A V E _ A T O M I C _ O P S
@ -15,123 +15,134 @@ IF (OPENTHREADS_ATOMIC_USE_MUTEX)
SET ( _OPENTHREADS_ATOMIC_USE_MUTEX 1 )
ELSE ( )
INCLUDE ( CheckCXXSourceRuns )
# D o s t e p b y s t e p c h e c k i n g ,
CHECK_CXX_SOURCE_RUNS ( "
# i n c l u d e < c s t d l i b >
i n t main ( )
{
u n s i g n e d v a l u e = 0 ;
v o i d * p t r = & v a l u e ;
__sync_add_and_fetch ( &value, 1 ) ;
__sync_synchronize ( ) ;
__sync_sub_and_fetch ( &value, 1 ) ;
if ( !__sync_bool_compare_and_swap(&value, 0, 1 ) )
r e t u r n E X I T _ F A I L U R E ;
if ( !__sync_bool_compare_and_swap(&ptr, ptr, ptr ) )
r e t u r n E X I T _ F A I L U R E ;
r e t u r n E X I T _ S U C C E S S ;
}
" _ O P E N T H R E A D S _ A T O M I C _ U S E _ G C C _ B U I L T I N S )
CHECK_CXX_SOURCE_RUNS ( "
# i n c l u d e < s t d l i b . h >
i n t main ( int, const char** )
{
u n s i g n e d v a l u e = 0 ;
v o i d * p t r = & v a l u e ;
__add_and_fetch ( &value, 1 ) ;
__synchronize ( value ) ;
__sub_and_fetch ( &value, 1 ) ;
if ( !__compare_and_swap(&value, 0, 1 ) )
r e t u r n E X I T _ F A I L U R E ;
if ( !__compare_and_swap((unsigned long* ) & p t r , ( u n s i g n e d l o n g ) p t r , ( u n s i g n e d l o n g ) p t r ) )
r e t u r n E X I T _ F A I L U R E ;
r e t u r n E X I T _ S U C C E S S ;
}
" _ O P E N T H R E A D S _ A T O M I C _ U S E _ M I P O S P R O _ B U I L T I N S )
CHECK_CXX_SOURCE_RUNS ( "
# i n c l u d e < a t o m i c . h >
# i n c l u d e < c s t d l i b >
i n t main ( int, const char** )
{
u i n t _ t v a l u e = 0 ;
v o i d * p t r = & v a l u e ;
atomic_inc_uint_nv ( &value ) ;
membar_consumer ( ) ;
atomic_dec_uint_nv ( &value ) ;
if ( 0 != atomic_cas_uint(&value, 0, 1 ) )
r e t u r n E X I T _ F A I L U R E ;
if ( ptr != atomic_cas_ptr(&ptr, ptr, ptr ) )
r e t u r n E X I T _ F A I L U R E ;
r e t u r n E X I T _ S U C C E S S ;
}
" _ O P E N T H R E A D S _ A T O M I C _ U S E _ S U N )
CHECK_CXX_SOURCE_RUNS ( "
# i n c l u d e < w i n d o w s . h >
# i n c l u d e < i n t r i n . h >
# i n c l u d e < c s t d l i b >
# p r a g m a intrinsic ( _InterlockedAnd )
# p r a g m a intrinsic ( _InterlockedOr )
# p r a g m a intrinsic ( _InterlockedXor )
i n t main ( int, const char** )
{
v o l a t i l e l o n g v a l u e = 0 ;
l o n g d a t a = 0 ;
l o n g * v o l a t i l e p t r = & d a t a ;
InterlockedIncrement ( &value ) ;
MemoryBarrier ( ) ;
InterlockedDecrement ( &value ) ;
if ( 0 != InterlockedCompareExchange(&value, 1, 0 ) )
r e t u r n E X I T _ F A I L U R E ;
if ( ptr != InterlockedCompareExchangePointer((PVOID volatile* ) & p t r , ( P V O I D ) p t r , ( P V O I D ) p t r ) )
r e t u r n E X I T _ F A I L U R E ;
r e t u r n E X I T _ S U C C E S S ;
}
" _ O P E N T H R E A D S _ A T O M I C _ U S E _ W I N 3 2 _ I N T E R L O C K E D )
CHECK_CXX_SOURCE_RUNS ( "
# i n c l u d e < l i b k e r n / O S A t o m i c . h >
i n t main ( )
{
v o l a t i l e i n t 3 2 _ t v a l u e = 0 ;
l o n g d a t a = 0 ;
l o n g * v o l a t i l e p t r = & d a t a ;
OSAtomicIncrement32 ( &value ) ;
OSMemoryBarrier ( ) ;
OSAtomicDecrement32 ( &value ) ;
OSAtomicCompareAndSwapInt ( value, 1, &value ) ;
OSAtomicCompareAndSwapPtr ( ptr, ptr, ( void * volatile * ) &ptr ) ;
}
" _ O P E N T H R E A D S _ A T O M I C _ U S E _ B S D _ A T O M I C )
IF ( NOT _OPENTHREADS_ATOMIC_USE_GCC_BUILTINS AND
N O T _ O P E N T H R E A D S _ A T O M I C _ U S E _ M I P O S P R O _ B U I L T I N S A N D
N O T _ O P E N T H R E A D S _ A T O M I C _ U S E _ S U N A N D
N O T _ O P E N T H R E A D S _ A T O M I C _ U S E _ W I N 3 2 _ I N T E R L O C K E D A N D
N O T _ O P E N T H R E A D S _ A T O M I C _ U S E _ B S D _ A T O M I C )
SET ( _OPENTHREADS_ATOMIC_USE_MUTEX 1 )
# a s t h e t e s t d o e s n o t w o r k f o r I O S h a r d c o d e t h e A T O M I C i m p l e m e n t a t i o n
IF ( OSG_BUILD_PLATFORM_IPHONE_SIMULATOR OR OSG_BUILD_PLATFORM_IPHONE )
SET ( _OPENTHREADS_ATOMIC_USE_GCC_BUILTINS 0 )
SET ( _OPENTHREADS_ATOMIC_USE_MIPOSPRO_BUILTINS 0 )
SET ( _OPENTHREADS_ATOMIC_USE_SUN 0 )
SET ( _OPENTHREADS_ATOMIC_USE_WIN32_INTERLOCKED 0 )
SET ( _OPENTHREADS_ATOMIC_USE_MUTEX 0 )
SET ( _OPENTHREADS_ATOMIC_USE_BSD_ATOMIC 1 )
ELSE ( )
INCLUDE ( CheckCXXSourceRuns )
# D o s t e p b y s t e p c h e c k i n g ,
CHECK_CXX_SOURCE_RUNS ( "
# i n c l u d e < c s t d l i b >
i n t main ( )
{
u n s i g n e d v a l u e = 0 ;
v o i d * p t r = & v a l u e ;
__sync_add_and_fetch ( &value, 1 ) ;
__sync_synchronize ( ) ;
__sync_sub_and_fetch ( &value, 1 ) ;
if ( !__sync_bool_compare_and_swap(&value, 0, 1 ) )
r e t u r n E X I T _ F A I L U R E ;
if ( !__sync_bool_compare_and_swap(&ptr, ptr, ptr ) )
r e t u r n E X I T _ F A I L U R E ;
r e t u r n E X I T _ S U C C E S S ;
}
" _ O P E N T H R E A D S _ A T O M I C _ U S E _ G C C _ B U I L T I N S )
CHECK_CXX_SOURCE_RUNS ( "
# i n c l u d e < s t d l i b . h >
i n t main ( int, const char** )
{
u n s i g n e d v a l u e = 0 ;
v o i d * p t r = & v a l u e ;
__add_and_fetch ( &value, 1 ) ;
__synchronize ( value ) ;
__sub_and_fetch ( &value, 1 ) ;
if ( !__compare_and_swap(&value, 0, 1 ) )
r e t u r n E X I T _ F A I L U R E ;
if ( !__compare_and_swap((unsigned long* ) & p t r , ( u n s i g n e d l o n g ) p t r , ( u n s i g n e d l o n g ) p t r ) )
r e t u r n E X I T _ F A I L U R E ;
r e t u r n E X I T _ S U C C E S S ;
}
" _ O P E N T H R E A D S _ A T O M I C _ U S E _ M I P O S P R O _ B U I L T I N S )
CHECK_CXX_SOURCE_RUNS ( "
# i n c l u d e < a t o m i c . h >
# i n c l u d e < c s t d l i b >
i n t main ( int, const char** )
{
u i n t _ t v a l u e = 0 ;
v o i d * p t r = & v a l u e ;
atomic_inc_uint_nv ( &value ) ;
membar_consumer ( ) ;
atomic_dec_uint_nv ( &value ) ;
if ( 0 != atomic_cas_uint(&value, 0, 1 ) )
r e t u r n E X I T _ F A I L U R E ;
if ( ptr != atomic_cas_ptr(&ptr, ptr, ptr ) )
r e t u r n E X I T _ F A I L U R E ;
r e t u r n E X I T _ S U C C E S S ;
}
" _ O P E N T H R E A D S _ A T O M I C _ U S E _ S U N )
CHECK_CXX_SOURCE_RUNS ( "
# i n c l u d e < w i n d o w s . h >
# i n c l u d e < i n t r i n . h >
# i n c l u d e < c s t d l i b >
# p r a g m a intrinsic ( _InterlockedAnd )
# p r a g m a intrinsic ( _InterlockedOr )
# p r a g m a intrinsic ( _InterlockedXor )
i n t main ( int, const char** )
{
v o l a t i l e l o n g v a l u e = 0 ;
l o n g d a t a = 0 ;
l o n g * v o l a t i l e p t r = & d a t a ;
InterlockedIncrement ( &value ) ;
MemoryBarrier ( ) ;
InterlockedDecrement ( &value ) ;
if ( 0 != InterlockedCompareExchange(&value, 1, 0 ) )
r e t u r n E X I T _ F A I L U R E ;
if ( ptr != InterlockedCompareExchangePointer((PVOID volatile* ) & p t r , ( P V O I D ) p t r , ( P V O I D ) p t r ) )
r e t u r n E X I T _ F A I L U R E ;
r e t u r n E X I T _ S U C C E S S ;
}
" _ O P E N T H R E A D S _ A T O M I C _ U S E _ W I N 3 2 _ I N T E R L O C K E D )
CHECK_CXX_SOURCE_RUNS ( "
# i n c l u d e < l i b k e r n / O S A t o m i c . h >
i n t main ( )
{
v o l a t i l e i n t 3 2 _ t v a l u e = 0 ;
l o n g d a t a = 0 ;
l o n g * v o l a t i l e p t r = & d a t a ;
OSAtomicIncrement32 ( &value ) ;
OSMemoryBarrier ( ) ;
OSAtomicDecrement32 ( &value ) ;
OSAtomicCompareAndSwapInt ( value, 1, &value ) ;
OSAtomicCompareAndSwapPtr ( ptr, ptr, ( void * volatile * ) &ptr ) ;
}
" _ O P E N T H R E A D S _ A T O M I C _ U S E _ B S D _ A T O M I C )
IF ( NOT _OPENTHREADS_ATOMIC_USE_GCC_BUILTINS AND
N O T _ O P E N T H R E A D S _ A T O M I C _ U S E _ M I P O S P R O _ B U I L T I N S A N D
N O T _ O P E N T H R E A D S _ A T O M I C _ U S E _ S U N A N D
N O T _ O P E N T H R E A D S _ A T O M I C _ U S E _ W I N 3 2 _ I N T E R L O C K E D A N D
N O T _ O P E N T H R E A D S _ A T O M I C _ U S E _ B S D _ A T O M I C )
SET ( _OPENTHREADS_ATOMIC_USE_MUTEX 1 )
ENDIF ( )
ENDIF ( )
ENDIF ( )