]> gitweb.factorcode.org Git - factor.git/blob - vm/atomic-cl-64.hpp
vm: better organize atomics and sample counter
[factor.git] / vm / atomic-cl-64.hpp
1 namespace factor {
2         namespace atomic {
3                 __forceinline static bool cas(volatile cell *ptr, cell old_val, cell new_val)
4                 {
5                         return InterlockedCompareExchange64(
6                                 reinterpret_cast<volatile LONG64 *>(ptr),
7                                 (LONG64)old_val,
8                                 (LONG64)new_val) == (LONG64)old_val;
9                 }
10                 __forceinline static bool cas(volatile fixnum *ptr, fixnum old_val, fixnum new_val)
11                 {
12                         return InterlockedCompareExchange64(
13                                 reinterpret_cast<volatile LONG64 *>(ptr),
14                                 (LONG64)old_val,
15                                 (LONG64)new_val) == (LONG64)old_val;
16                 }
17
18                 __forceinline static cell add(volatile cell *ptr, cell val)
19                 {
20                         return (cell)InterlockedAdd64(
21                                 reinterpret_cast<volatile LONG64 *>(ptr), (LONG64)val);
22                 }
23                 __forceinline static fixnum add(volatile fixnum *ptr, fixnum val)
24                 {
25                         return (fixnum)InterlockedAdd64(
26                                 reinterpret_cast<volatile LONG64 *>(ptr), (LONG64)val);
27                 }
28
29                 __forceinline static cell subtract(volatile cell *ptr, cell val)
30                 {
31                         return (cell)InterlockedAdd64(
32                                 reinterpret_cast<volatile LONG64 *>(ptr), -(LONG64)val);
33                 }
34                 __forceinline static fixnum subtract(volatile fixnum *ptr, fixnum val)
35                 {
36                         return (fixnum)InterlockedAdd64(
37                                 reinterpret_cast<volatile LONG64 *>(ptr), -(LONG64)val);
38                 }
39
40                 __forceinline static void fence()
41                 {
42                         MemoryBarrier();
43                 }
44         }
45 }
46