40 lines
		
	
	
		
			1.4 KiB
		
	
	
	
		
			C++
		
	
	
			
		
		
	
	
			40 lines
		
	
	
		
			1.4 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"
 |