#define FACTOR_FORCE_INLINE __forceinline namespace factor { namespace atomic { __forceinline static bool cas(volatile cell* ptr, cell old_val, cell new_val) { return InterlockedCompareExchange64(reinterpret_cast(ptr), (LONG64)old_val, (LONG64)new_val) == (LONG64)old_val; } __forceinline static bool cas(volatile fixnum* ptr, fixnum old_val, fixnum new_val) { return InterlockedCompareExchange64(reinterpret_cast(ptr), (LONG64)old_val, (LONG64)new_val) == (LONG64)old_val; } __forceinline static cell fetch_add(volatile cell* ptr, cell val) { return (cell)InterlockedExchangeAdd64( reinterpret_cast(ptr), (LONG64)val); } __forceinline static fixnum fetch_add(volatile fixnum* ptr, fixnum val) { return (fixnum)InterlockedExchangeAdd64( reinterpret_cast(ptr), (LONG64)val); } __forceinline static cell fetch_subtract(volatile cell* ptr, cell val) { return (cell)InterlockedExchangeAdd64( reinterpret_cast(ptr), -(LONG64)val); } __forceinline static fixnum fetch_subtract(volatile fixnum* ptr, fixnum val) { return (fixnum)InterlockedExchangeAdd64( reinterpret_cast(ptr), -(LONG64)val); } __forceinline static void fence() { MemoryBarrier(); } } } #include "atomic.hpp"