You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
					
					
						
							83 lines
						
					
					
						
							2.0 KiB
						
					
					
				
			
		
		
		
			
			
			
				
					
				
				
					
				
			
		
		
	
	
							83 lines
						
					
					
						
							2.0 KiB
						
					
					
				
								dnl Check for the __sync_add_and_fetch() and __sync_sub_and_fetch()
							 | 
						|
								dnl compiler built-ins.
							 | 
						|
								
							 | 
						|
								AC_DEFUN([AX__SYNC],
							 | 
						|
								[
							 | 
						|
								AH_TEMPLATE([HAVE___SYNC_ADD_AND_FETCH],
							 | 
						|
								  [Defined if the compiler provides __sync_add_and_fetch().])
							 | 
						|
								
							 | 
						|
								AC_CACHE_CHECK([for __sync_add_and_fetch], [ac_cv___sync_add_and_fetch],
							 | 
						|
								[
							 | 
						|
								  AC_LINK_IFELSE(
							 | 
						|
								    [AC_LANG_PROGRAM(
							 | 
						|
								      [[
							 | 
						|
								#include <stdlib.h>
							 | 
						|
								      ]], 
							 | 
						|
								      [[
							 | 
						|
								volatile int x = 1;
							 | 
						|
								volatile int y = __sync_add_and_fetch (&x, 1);
							 | 
						|
								if (x != 2 || y != 2)
							 | 
						|
								  abort ();
							 | 
						|
								      ]])],
							 | 
						|
								    [ac_cv___sync_add_and_fetch=yes],
							 | 
						|
								    [ac_cv___sync_add_and_fetch=no])
							 | 
						|
								])
							 | 
						|
								
							 | 
						|
								AS_IF([test "x$ac_cv___sync_add_and_fetch" = "xyes"],
							 | 
						|
								  [AC_DEFINE([HAVE___SYNC_ADD_AND_FETCH], [1])])
							 | 
						|
								
							 | 
						|
								AH_TEMPLATE([HAVE___SYNC_SUB_AND_FETCH], 
							 | 
						|
								  [Defined if the compiler provides __sync_sub_and_fetch().])
							 | 
						|
								
							 | 
						|
								AC_CACHE_CHECK([for __sync_sub_and_fetch], [ac_cv___sync_sub_and_fetch],
							 | 
						|
								[
							 | 
						|
								  AC_LINK_IFELSE(
							 | 
						|
								    [AC_LANG_PROGRAM(
							 | 
						|
								      [[
							 | 
						|
								#include <stdlib.h>
							 | 
						|
								      ]], 
							 | 
						|
								      [[
							 | 
						|
								volatile int x = 2;
							 | 
						|
								volatile int y = __sync_sub_and_fetch (&x, 1);
							 | 
						|
								if (x != 1 || y != 1)
							 | 
						|
								  abort ();
							 | 
						|
								      ]])],
							 | 
						|
								    [ac_cv___sync_sub_and_fetch=yes],
							 | 
						|
								    [ac_cv___sync_sub_and_fetch=no])
							 | 
						|
								])
							 | 
						|
								
							 | 
						|
								AS_IF([test "x$ac_cv___sync_sub_and_fetch" = "xyes"],
							 | 
						|
								  [AC_DEFINE([HAVE___SYNC_SUB_AND_FETCH], [1])])
							 | 
						|
								
							 | 
						|
								AH_TEMPLATE([HAVE_CXX11_ATOMICS], [Defined if the compiler provides
							 | 
						|
								  C++11 <atomic> header and increment, decrement operations.])
							 | 
						|
								
							 | 
						|
								AC_CACHE_CHECK([for C++11 atomics], [ac_cv_cxx11_atomics],
							 | 
						|
								[
							 | 
						|
								  AC_LINK_IFELSE(
							 | 
						|
								    [AC_LANG_PROGRAM(
							 | 
						|
								      [[
							 | 
						|
								#include <atomic>
							 | 
						|
								      ]],
							 | 
						|
								      [[
							 | 
						|
								#define TEST_ATOMIC(type) do { \
							 | 
						|
								std::atomic<type> x (0); \
							 | 
						|
								std::atomic_fetch_add_explicit (&x, static_cast<type>(1), std::memory_order_acquire); \
							 | 
						|
								std::atomic_fetch_sub_explicit (&x, static_cast<type>(1), std::memory_order_release); \
							 | 
						|
								} while (0)
							 | 
						|
								
							 | 
						|
								TEST_ATOMIC(int);
							 | 
						|
								TEST_ATOMIC(unsigned int);
							 | 
						|
								TEST_ATOMIC(long);
							 | 
						|
								TEST_ATOMIC(unsigned long);
							 | 
						|
								std::atomic_thread_fence (std::memory_order_acquire);
							 | 
						|
								      ]])],
							 | 
						|
								    [ac_cv_cxx11_atomics=yes],
							 | 
						|
								    [ac_cv_cxx11_atomics=no])
							 | 
						|
								])
							 | 
						|
								
							 | 
						|
								AS_IF([test "x$ac_cv_cxx11_atomics" = "xyes"],
							 | 
						|
								  [AC_DEFINE([HAVE_CXX11_ATOMICS], [1])])
							 | 
						|
								
							 | 
						|
								])
							 | 
						|
								
							 |