2011-11-02 00:00:46 -04:00
|
|
|
#define FACTOR_FORCE_INLINE __forceinline
|
|
|
|
|
2011-10-31 23:51:53 -04:00
|
|
|
namespace factor {
|
2013-05-11 21:43:04 -04:00
|
|
|
namespace atomic {
|
|
|
|
__forceinline static bool cas(volatile cell* ptr, cell old_val, cell new_val) {
|
|
|
|
return InterlockedCompareExchange(reinterpret_cast<volatile LONG*>(ptr),
|
|
|
|
(LONG) old_val, (LONG) new_val) ==
|
|
|
|
(LONG) old_val;
|
|
|
|
}
|
|
|
|
__forceinline static bool cas(volatile fixnum* ptr, fixnum old_val,
|
|
|
|
fixnum new_val) {
|
|
|
|
return InterlockedCompareExchange(reinterpret_cast<volatile LONG*>(ptr),
|
|
|
|
(LONG) old_val, (LONG) new_val) ==
|
|
|
|
(LONG) old_val;
|
|
|
|
}
|
2011-10-31 23:51:53 -04:00
|
|
|
|
2013-05-11 21:43:04 -04:00
|
|
|
__forceinline static cell fetch_add(volatile cell* ptr, cell val) {
|
2013-05-13 00:53:47 -04:00
|
|
|
return (cell)InterlockedExchangeAdd(reinterpret_cast<volatile LONG*>(ptr),
|
|
|
|
(LONG) val);
|
2013-05-11 21:43:04 -04:00
|
|
|
}
|
|
|
|
__forceinline static fixnum fetch_add(volatile fixnum* ptr, fixnum val) {
|
2013-05-13 00:53:47 -04:00
|
|
|
return (fixnum)InterlockedExchangeAdd(reinterpret_cast<volatile LONG*>(ptr),
|
|
|
|
(LONG) val);
|
2013-05-11 21:43:04 -04:00
|
|
|
}
|
2011-10-31 23:51:53 -04:00
|
|
|
|
2013-05-11 21:43:04 -04:00
|
|
|
__forceinline static cell fetch_subtract(volatile cell* ptr, cell val) {
|
2013-05-13 00:53:47 -04:00
|
|
|
return (cell)InterlockedExchangeAdd(reinterpret_cast<volatile LONG*>(ptr),
|
|
|
|
-(LONG)val);
|
2013-05-11 21:43:04 -04:00
|
|
|
}
|
|
|
|
__forceinline static fixnum fetch_subtract(volatile fixnum* ptr, fixnum val) {
|
2013-05-13 00:53:47 -04:00
|
|
|
return (fixnum)InterlockedExchangeAdd(reinterpret_cast<volatile LONG*>(ptr),
|
|
|
|
-(LONG)val);
|
2013-05-11 21:43:04 -04:00
|
|
|
}
|
2011-10-31 23:51:53 -04:00
|
|
|
|
2013-05-11 21:43:04 -04:00
|
|
|
__forceinline static void fence() { MemoryBarrier(); }
|
|
|
|
}
|
2011-10-31 23:51:53 -04:00
|
|
|
}
|
|
|
|
|
2011-11-02 00:00:46 -04:00
|
|
|
#include "atomic.hpp"
|