Thanks Clasius, fix now merged and checked into SVN.

On Wed, Oct 29, 2008 at 11:18 AM, Blasius Czink <[EMAIL PROTECTED]> wrote:
> Hi Robert,
>
> changed the CHECK_CXX_SOURCE_RUNS macro slightly to avoid the compile
> problems due to bugged "intrin.h". In such a case the mutex fallback will be
> used (see attached file).
>
> Best regards,
> Blasius
>
>
>
> # Check for availability of atomic operations
> # This module defines
> # OPENTHREADS_HAVE_ATOMIC_OPS
>
> INCLUDE(CheckCXXSourceRuns)
>
> # Do step by step checking,
> CHECK_CXX_SOURCE_RUNS("
> #include <cstdlib>
>
> int main()
> {
>   unsigned value = 0;
>   void* ptr = &value;
>   __sync_add_and_fetch(&value, 1);
>   __sync_synchronize();
>   __sync_sub_and_fetch(&value, 1);
>   if (!__sync_bool_compare_and_swap(&value, 0, 1))
>      return EXIT_FAILURE;
>
>   if (!__sync_bool_compare_and_swap(&ptr, ptr, ptr))
>      return EXIT_FAILURE;
>
>   return EXIT_SUCCESS;
> }
> " _OPENTHREADS_ATOMIC_USE_GCC_BUILTINS)
>
> CHECK_CXX_SOURCE_RUNS("
> #include <stdlib.h>
>
> int main(int, const char**)
> {
>   unsigned value = 0;
>   void* ptr = &value;
>   __add_and_fetch(&value, 1);
>   __synchronize(value);
>   __sub_and_fetch(&value, 1);
>   if (!__compare_and_swap(&value, 0, 1))
>      return EXIT_FAILURE;
>
>   if (!__compare_and_swap((unsigned long*)&ptr, (unsigned long)ptr,
> (unsigned long)ptr))
>      return EXIT_FAILURE;
>
>   return EXIT_SUCCESS;
> }
> " _OPENTHREADS_ATOMIC_USE_MIPOSPRO_BUILTINS)
>
> CHECK_CXX_SOURCE_RUNS("
> #include <atomic.h>
> #include <cstdlib>
>
> int main(int, const char**)
> {
>   uint_t value = 0;
>   void* ptr = &value;
>   atomic_inc_uint_nv(&value);
>   membar_consumer();
>   atomic_dec_uint_nv(&value);
>   if (0 != atomic_cas_uint(&value, 0, 1))
>      return EXIT_FAILURE;
>
>   if (ptr != atomic_cas_ptr(&ptr, ptr, ptr))
>      return EXIT_FAILURE;
>
>   return EXIT_SUCCESS;
> }
> " _OPENTHREADS_ATOMIC_USE_SUN)
>
> CHECK_CXX_SOURCE_RUNS("
> #include <windows.h>
> #include <intrin.h>
> #include <cstdlib>
>
> #pragma intrinsic(_InterlockedAnd)
> #pragma intrinsic(_InterlockedOr)
> #pragma intrinsic(_InterlockedXor)
>
> int main(int, const char**)
> {
>   volatile long value = 0;
>   long data = 0;
>   long* volatile ptr = &data;
>
>   InterlockedIncrement(&value);
>   MemoryBarrier();
>   InterlockedDecrement(&value);
>
>   if (0 != InterlockedCompareExchange(&value, 1, 0))
>      return EXIT_FAILURE;
>
>   if (ptr != InterlockedCompareExchangePointer((PVOID volatile*)&ptr,
> (PVOID)ptr, (PVOID)ptr))
>      return EXIT_FAILURE;
>
>   return EXIT_SUCCESS;
> }
> " _OPENTHREADS_ATOMIC_USE_WIN32_INTERLOCKED)
>
> CHECK_CXX_SOURCE_RUNS("
> #include <libkern/OSAtomic.h>
>
> int main()
> {
>  volatile int32_t value = 0;
>  long data = 0;
>  long * volatile ptr = &data;
>
>  OSAtomicIncrement32(&value);
>  OSMemoryBarrier();
>  OSAtomicDecrement32(&value);
>  OSAtomicCompareAndSwapInt(value, 1, &value);
>  OSAtomicCompareAndSwapPtr(ptr, ptr, (void * volatile *)&ptr);
> }
> " _OPENTHREADS_ATOMIC_USE_BSD_ATOMIC)
>
>
> IF(NOT _OPENTHREADS_ATOMIC_USE_GCC_BUILTINS AND NOT
> _OPENTHREADS_ATOMIC_USE_MIPOSPRO_BUILTINS AND NOT
> _OPENTHREADS_ATOMIC_USE_SUN AND NOT
> _OPENTHREADS_ATOMIC_USE_WIN32_INTERLOCKED AND NOT
> _OPENTHREADS_ATOMIC_USE_BSD_ATOMIC)
>  SET(_OPENTHREADS_ATOMIC_USE_MUTEX 1)
> ENDIF(NOT _OPENTHREADS_ATOMIC_USE_GCC_BUILTINS AND NOT
> _OPENTHREADS_ATOMIC_USE_MIPOSPRO_BUILTINS AND NOT
> _OPENTHREADS_ATOMIC_USE_SUN AND NOT
> _OPENTHREADS_ATOMIC_USE_WIN32_INTERLOCKED AND NOT
> _OPENTHREADS_ATOMIC_USE_BSD_ATOMIC)
>
> _______________________________________________
> osg-submissions mailing list
> [email protected]
> http://lists.openscenegraph.org/listinfo.cgi/osg-submissions-openscenegraph.org
>
>
_______________________________________________
osg-submissions mailing list
[email protected]
http://lists.openscenegraph.org/listinfo.cgi/osg-submissions-openscenegraph.org

Reply via email to