Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorYimingWu <xp8110@outlook.com>2022-05-31 15:08:37 +0300
committerYimingWu <xp8110@outlook.com>2022-05-31 15:09:39 +0300
commite37027634bd3cb53a8447f2728c87e3fa122b5bb (patch)
treed1b964f7fbb6645e2577b7458abc2457e3c19f6e /intern/atomic
parent4669178fc3786e1aebb117892d8dc6a2ce4dc955 (diff)
Intern/atomic: Adding atomic_load/store_ptr support.
We need to provide _ptr ones with _z ones on the API level. Reviewed By: Sergey Sharybin (sergey) Ref D15076
Diffstat (limited to 'intern/atomic')
-rw-r--r--intern/atomic/atomic_ops.h2
-rw-r--r--intern/atomic/intern/atomic_ops_ext.h18
-rw-r--r--intern/atomic/tests/atomic_test.cc19
3 files changed, 39 insertions, 0 deletions
diff --git a/intern/atomic/atomic_ops.h b/intern/atomic/atomic_ops.h
index 2bedce1b4f0..d1d672a1c4b 100644
--- a/intern/atomic/atomic_ops.h
+++ b/intern/atomic/atomic_ops.h
@@ -124,6 +124,8 @@ ATOMIC_INLINE unsigned int atomic_fetch_and_sub_u(unsigned int *p, unsigned int
ATOMIC_INLINE unsigned int atomic_cas_u(unsigned int *v, unsigned int old, unsigned int _new);
ATOMIC_INLINE void *atomic_cas_ptr(void **v, void *old, void *_new);
+ATOMIC_INLINE void *atomic_load_ptr(const void **v);
+ATOMIC_INLINE void atomic_store_ptr(void **p, void *v);
ATOMIC_INLINE float atomic_cas_float(float *v, float old, float _new);
diff --git a/intern/atomic/intern/atomic_ops_ext.h b/intern/atomic/intern/atomic_ops_ext.h
index 6ecc47f18be..fcf01c942ff 100644
--- a/intern/atomic/intern/atomic_ops_ext.h
+++ b/intern/atomic/intern/atomic_ops_ext.h
@@ -205,6 +205,24 @@ ATOMIC_INLINE void *atomic_cas_ptr(void **v, void *old, void *_new)
#endif
}
+ATOMIC_INLINE void *atomic_load_ptr(const void **v)
+{
+#if (LG_SIZEOF_PTR == 8)
+ return (void *)atomic_load_uint64((const uint64_t *)v);
+#elif (LG_SIZEOF_PTR == 4)
+ return (void *)atomic_load_uint32((const uint32_t *)v);
+#endif
+}
+
+ATOMIC_INLINE void atomic_store_ptr(void **p, void *v)
+{
+#if (LG_SIZEOF_PTR == 8)
+ atomic_store_uint64((uint64_t *)p, (uint64_t)v);
+#elif (LG_SIZEOF_PTR == 4)
+ atomic_store_uint32((uint32_t *)p, (uint32_t)v);
+#endif
+}
+
/******************************************************************************/
/* float operations. */
ATOMIC_STATIC_ASSERT(sizeof(float) == sizeof(uint32_t), "sizeof(float) != sizeof(uint32_t)");
diff --git a/intern/atomic/tests/atomic_test.cc b/intern/atomic/tests/atomic_test.cc
index ee06085c95d..37a66cf0e9c 100644
--- a/intern/atomic/tests/atomic_test.cc
+++ b/intern/atomic/tests/atomic_test.cc
@@ -1060,6 +1060,25 @@ TEST(atomic, atomic_cas_ptr)
}
}
+TEST(atomic, atomic_load_ptr)
+{
+ {
+ void *value = INT_AS_PTR(0x7f);
+ void *dest = atomic_load_ptr(&value);
+ EXPECT_EQ(dest, INT_AS_PTR(0x7f));
+ }
+}
+
+TEST(atomic, atomic_store_ptr)
+{
+ {
+ void *value = INT_AS_PTR(0x7f);
+ void *dest = nullptr;
+ atomic_store_ptr(&dest, value);
+ EXPECT_EQ(dest, INT_AS_PTR(0x7f));
+ }
+}
+
#undef INT_AS_PTR
/** \} */