Fix SharedSingleton to use memoryBarrier

This commit is contained in:
Vinnie Falco
2013-09-17 17:58:21 -07:00
parent f343941a96
commit 43ebbb1c70
3 changed files with 7 additions and 9 deletions

View File

@@ -92,6 +92,7 @@ public:
bassert (lifetime == SingletonLifetime::createOnDemand || ! staticData.destructorCalled); bassert (lifetime == SingletonLifetime::createOnDemand || ! staticData.destructorCalled);
staticData.instance = &staticData.object; staticData.instance = &staticData.object;
new (staticData.instance) SharedSingleton (lifetime); new (staticData.instance) SharedSingleton (lifetime);
memoryBarrier();
instance = staticData.instance; instance = staticData.instance;
} }
} }

View File

@@ -131,9 +131,6 @@ public:
*/ */
Type compareAndSetValue (Type newValue, Type valueToCompare) noexcept; Type compareAndSetValue (Type newValue, Type valueToCompare) noexcept;
/** Implements a memory read/write barrier. */
static void memoryBarrier() noexcept;
//============================================================================== //==============================================================================
#if BEAST_64BIT #if BEAST_64BIT
BEAST_ALIGN (8) BEAST_ALIGN (8)
@@ -373,8 +370,7 @@ inline Type Atomic<Type>::compareAndSetValue (const Type newValue, const Type va
#endif #endif
} }
template <typename Type> inline void memoryBarrier() noexcept
inline void Atomic<Type>::memoryBarrier() noexcept
{ {
#if BEAST_ATOMICS_MAC #if BEAST_ATOMICS_MAC
OSMemoryBarrier(); OSMemoryBarrier();
@@ -389,4 +385,5 @@ inline void Atomic<Type>::memoryBarrier() noexcept
#pragma warning (pop) #pragma warning (pop)
#endif #endif
#endif // BEAST_ATOMIC_H_INCLUDED #endif

View File

@@ -322,14 +322,14 @@ public:
test.expect (a.get() == (Type) 10); test.expect (a.get() == (Type) 10);
a += (Type) 15; a += (Type) 15;
test.expect (a.get() == (Type) 25); test.expect (a.get() == (Type) 25);
a.memoryBarrier(); memoryBarrier();
a -= (Type) 5; a -= (Type) 5;
test.expect (a.get() == (Type) 20); test.expect (a.get() == (Type) 20);
test.expect (++a == (Type) 21); test.expect (++a == (Type) 21);
++a; ++a;
test.expect (--a == (Type) 21); test.expect (--a == (Type) 21);
test.expect (a.get() == (Type) 21); test.expect (a.get() == (Type) 21);
a.memoryBarrier(); memoryBarrier();
testFloat (test); testFloat (test);
} }
@@ -338,7 +338,7 @@ public:
{ {
Atomic<Type> a, b; Atomic<Type> a, b;
a = (Type) 21; a = (Type) 21;
a.memoryBarrier(); memoryBarrier();
/* These are some simple test cases to check the atomics - let me know /* These are some simple test cases to check the atomics - let me know
if any of these assertions fail on your system! if any of these assertions fail on your system!