32 lines
		
	
	
		
			1.1 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			32 lines
		
	
	
		
			1.1 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
/* util.h */
 | 
						|
#ifndef UTIL_H
 | 
						|
#define UTIL_H
 | 
						|
 | 
						|
#ifdef __cplusplus
 | 
						|
extern "C" {
 | 
						|
#endif
 | 
						|
 | 
						|
#if (defined(__GNUC__) && __GNUC__ >= 4 && (__GNUC__ > 4 || __GNUC_MINOR__ >= 1) \
 | 
						|
	&& defined(__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4)) \
 | 
						|
	|| (defined(__INTEL_COMPILER) && !defined(_WIN32))
 | 
						|
/* atomic operations are defined by ICC and GCC >= 4.1, but by the later one supposedly not for ARM */
 | 
						|
/* note: ICC on ia64 platform possibly require ia64intrin.h, need testing */
 | 
						|
# define atomic_compare_and_swap(ptr, oldval, newval) __sync_val_compare_and_swap(ptr, oldval, newval)
 | 
						|
#elif defined(_MSC_VER)
 | 
						|
# include <windows.h>
 | 
						|
# define atomic_compare_and_swap(ptr, oldval, newval) InterlockedCompareExchange(ptr, newval, oldval)
 | 
						|
#elif defined(__sun)
 | 
						|
# include <atomic.h>
 | 
						|
# define atomic_compare_and_swap(ptr, oldval, newval) atomic_cas_32(ptr, oldval, newval)
 | 
						|
#else
 | 
						|
/* pray that it will work */
 | 
						|
# define atomic_compare_and_swap(ptr, oldval, newval) { if(*(ptr) == (oldval)) *(ptr) = (newval); }
 | 
						|
# define NO_ATOMIC_BUILTINS
 | 
						|
#endif
 | 
						|
 | 
						|
#ifdef __cplusplus
 | 
						|
} /* extern "C" */
 | 
						|
#endif /* __cplusplus */
 | 
						|
 | 
						|
#endif /* UTIL_H */
 |