summaryrefslogtreecommitdiff
path: root/src/components/include/utils/atomic.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/components/include/utils/atomic.h')
-rw-r--r--src/components/include/utils/atomic.h30
1 files changed, 17 insertions, 13 deletions
diff --git a/src/components/include/utils/atomic.h b/src/components/include/utils/atomic.h
index f80455b748..9cb1571962 100644
--- a/src/components/include/utils/atomic.h
+++ b/src/components/include/utils/atomic.h
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2013, Ford Motor Company
+ * Copyright (c) 2013-2015, Ford Motor Company
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
@@ -33,14 +33,18 @@
#ifndef SRC_COMPONENTS_INCLUDE_UTILS_ATOMIC_H_
#define SRC_COMPONENTS_INCLUDE_UTILS_ATOMIC_H_
-#ifdef __QNXNTO__
+#if defined(__QNXNTO__)
#include <atomic.h>
+#elif defined(OS_WINDOWS)
+#include "utils/winhdr.h"
#endif
#if defined(__QNXNTO__)
#define atomic_post_inc(ptr) atomic_add_value((ptr), 1)
#elif defined(__GNUG__)
#define atomic_post_inc(ptr) __sync_fetch_and_add((ptr), 1)
+#elif defined(OS_WINDOWS)
+#define atomic_post_inc(ptr) (InterlockedIncrement((ptr)) - 1)
#else
#warning "atomic_post_inc() implementation is not atomic"
#define atomic_post_inc(ptr) (*(ptr))++
@@ -50,36 +54,36 @@
#define atomic_post_dec(ptr) atomic_sub_value((ptr), 1)
#elif defined(__GNUG__)
#define atomic_post_dec(ptr) __sync_fetch_and_sub((ptr), 1)
+#elif defined(OS_WINDOWS)
+#define atomic_post_dec(ptr) (InterlockedDecrement((ptr)) + 1)
#else
#warning "atomic_post_dec() implementation is not atomic"
#define atomic_post_dec(ptr) (*(ptr))--
#endif
-#if defined(__QNXNTO__)
-// on QNX pointer assignment is believed to be atomic
-#define atomic_pointer_assign(dst, src) (dst) = (src)
-#elif defined(__GNUG__)
-// with g++ pointer assignment is believed to be atomic
+// pointer assignment is believed to be atomic
#define atomic_pointer_assign(dst, src) (dst) = (src)
-#else
-#warning atomic_pointer_assign() implementation may be non-atomic
-#define atomic_pointer_assign(dst, src) (dst) = (src)
-#endif
#if defined(__QNXNTO__)
#define atomic_post_set(dst) atomic_set_value(dst, 1)
#elif defined(__GNUG__)
#define atomic_post_set(dst) __sync_val_compare_and_swap((dst), 0, 1)
+#elif defined(OS_WINDOWS)
+#define atomic_post_set(dst) InterlockedCompareExchange((dst), 1, 0)
#else
-#error "atomic post set operation not defined"
+#warning "atomic_post_set() implementation is not atomic"
+#define atomic_post_set(dst) (dst) = (dst) == 0 ? 1 : (dst)
#endif
#if defined(__QNXNTO__)
#define atomic_post_clr(dst) atomic_clr_value(dst, 1)
#elif defined(__GNUG__)
#define atomic_post_clr(dst) __sync_val_compare_and_swap((dst), 1, 0)
+#elif defined(OS_WINDOWS)
+#define atomic_post_clr(dst) InterlockedCompareExchange((dst), 0, 1)
#else
-#error "atomic post clear operation not defined"
+#warning "atomic_post_clr() implementation is not atomic"
+#define atomic_post_clr(dst) (dst) = (dst) == 1 ? 0 : (dst)
#endif
#endif // SRC_COMPONENTS_INCLUDE_UTILS_ATOMIC_H_