Index: runtime/vm/atomic_win.h |
diff --git a/runtime/vm/atomic_win.h b/runtime/vm/atomic_win.h |
index 38ec10a1f8996841078d0dec585ed38f8fe84601..2f8ee20b5817e77e7869ba3dccfa857e21bdc441 100644 |
--- a/runtime/vm/atomic_win.h |
+++ b/runtime/vm/atomic_win.h |
@@ -28,6 +28,19 @@ inline uintptr_t AtomicOperations::FetchAndIncrement(uintptr_t* p) { |
} |
+inline intptr_t AtomicOperations::FetchAndIncrement(intptr_t* p) { |
+#if defined(HOST_ARCH_X64) |
+ return static_cast<intptr_t>( |
+ InterlockedIncrement64(reinterpret_cast<LONGLONG*>(p))) - 1; |
+#elif defined(HOST_ARCH_IA32) |
+ return static_cast<intptr_t>( |
+ InterlockedIncrement(reinterpret_cast<LONG*>(p))) - 1; |
+#else |
+#error Unsupported host architecture. |
+#endif |
+} |
+ |
+ |
inline void AtomicOperations::IncrementBy(intptr_t* p, intptr_t value) { |
#if defined(HOST_ARCH_X64) |
InterlockedExchangeAdd64(reinterpret_cast<LONGLONG*>(p), |
@@ -64,6 +77,19 @@ inline uintptr_t AtomicOperations::FetchAndDecrement(uintptr_t* p) { |
} |
+inline intptr_t AtomicOperations::FetchAndDecrement(intptr_t* p) { |
+#if defined(HOST_ARCH_X64) |
+ return static_cast<intptr_t>( |
+ InterlockedDecrement64(reinterpret_cast<LONGLONG*>(p))) + 1; |
+#elif defined(HOST_ARCH_IA32) |
+ return static_cast<intptr_t>( |
+ InterlockedDecrement(reinterpret_cast<LONG*>(p))) + 1; |
+#else |
+#error Unsupported host architecture. |
+#endif |
+} |
+ |
+ |
inline void AtomicOperations::DecrementBy(intptr_t* p, intptr_t value) { |
#if defined(HOST_ARCH_X64) |
InterlockedExchangeAdd64(reinterpret_cast<LONGLONG*>(p), |