46 lines
		
	
	
		
			1.2 KiB
		
	
	
	
		
			C++
		
	
	
			
		
		
	
	
			46 lines
		
	
	
		
			1.2 KiB
		
	
	
	
		
			C++
		
	
	
| #define FACTOR_FORCE_INLINE __attribute__((always_inline)) inline
 | |
| namespace factor {
 | |
| 	namespace atomic {
 | |
| 		__attribute__((always_inline))
 | |
| 		inline static bool cas(volatile cell *ptr, cell old_val, cell new_val)
 | |
| 		{
 | |
| 			return __sync_bool_compare_and_swap(ptr, old_val, new_val);
 | |
| 		}
 | |
| 		__attribute__((always_inline))
 | |
| 		inline static bool cas(volatile fixnum *ptr, fixnum old_val, fixnum new_val)
 | |
| 		{
 | |
| 			return __sync_bool_compare_and_swap(ptr, old_val, new_val);
 | |
| 		}
 | |
| 
 | |
| 		__attribute__((always_inline))
 | |
| 		inline static cell fetch_add(volatile cell *ptr, cell val)
 | |
| 		{
 | |
| 			return __sync_fetch_and_add(ptr, val);
 | |
| 		}
 | |
| 		__attribute__((always_inline))
 | |
| 		inline static fixnum fetch_add(volatile fixnum *ptr, fixnum val)
 | |
| 		{
 | |
| 			return __sync_fetch_and_add(ptr, val);
 | |
| 		}
 | |
| 
 | |
| 		__attribute__((always_inline))
 | |
| 		inline static cell fetch_subtract(volatile cell *ptr, cell val)
 | |
| 		{
 | |
| 			return __sync_fetch_and_sub(ptr, val);
 | |
| 		}
 | |
| 		__attribute__((always_inline))
 | |
| 		inline static fixnum fetch_subtract(volatile fixnum *ptr, fixnum val)
 | |
| 		{
 | |
| 			return __sync_fetch_and_sub(ptr, val);
 | |
| 		}
 | |
| 
 | |
| 		__attribute__((always_inline))
 | |
| 		inline static void fence()
 | |
| 		{
 | |
| 			__sync_synchronize();
 | |
| 		}
 | |
| 	}
 | |
| }
 | |
| 
 | |
| #include "atomic.hpp"
 |