2011-11-02 00:00:46 -04:00
|
|
|
#define FACTOR_FORCE_INLINE __forceinline
|
|
|
|
|
2011-10-31 23:51:53 -04:00
|
|
|
namespace factor {
|
|
|
|
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-11-07 20:58:53 -05:00
|
|
|
__forceinline static cell fetch_add(volatile cell *ptr, cell val)
|
2011-10-31 23:51:53 -04:00
|
|
|
{
|
2011-11-07 20:58:53 -05:00
|
|
|
return (cell)InterlockedExchangeAdd(
|
2011-10-31 23:51:53 -04:00
|
|
|
reinterpret_cast<volatile LONG *>(ptr), (LONG)val);
|
|
|
|
}
|
2011-11-07 20:58:53 -05:00
|
|
|
__forceinline static fixnum fetch_add(volatile fixnum *ptr, fixnum val)
|
2011-10-31 23:51:53 -04:00
|
|
|
{
|
2011-11-07 20:58:53 -05:00
|
|
|
return (fixnum)InterlockedExchangeAdd(
|
2011-10-31 23:51:53 -04:00
|
|
|
reinterpret_cast<volatile LONG *>(ptr), (LONG)val);
|
|
|
|
}
|
|
|
|
|
2011-11-07 20:58:53 -05:00
|
|
|
__forceinline static cell fetch_subtract(volatile cell *ptr, cell val)
|
2011-10-31 23:51:53 -04:00
|
|
|
{
|
2011-11-07 20:58:53 -05:00
|
|
|
return (cell)InterlockedExchangeAdd(
|
2011-10-31 23:51:53 -04:00
|
|
|
reinterpret_cast<volatile LONG *>(ptr), -(LONG)val);
|
|
|
|
}
|
2011-11-07 20:58:53 -05:00
|
|
|
__forceinline static fixnum fetch_subtract(volatile fixnum *ptr, fixnum val)
|
2011-10-31 23:51:53 -04:00
|
|
|
{
|
2011-11-07 20:58:53 -05:00
|
|
|
return (fixnum)InterlockedExchangeAdd(
|
2011-10-31 23:51:53 -04:00
|
|
|
reinterpret_cast<volatile LONG *>(ptr), -(LONG)val);
|
|
|
|
}
|
|
|
|
|
|
|
|
__forceinline static void fence()
|
|
|
|
{
|
|
|
|
MemoryBarrier();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2011-11-02 00:00:46 -04:00
|
|
|
#include "atomic.hpp"
|