|
Boost-Commit : |
From: xushiweizh_at_[hidden]
Date: 2008-05-13 17:18:32
Author: xushiwei
Date: 2008-05-13 17:18:31 EDT (Tue, 13 May 2008)
New Revision: 45343
URL: http://svn.boost.org/trac/boost/changeset/45343
Log:
ticket #1879: TaggedCompareAndSwap
Text files modified:
sandbox/memory/boost/detail/winapi/atomic/windows.hpp | 40 ++++++++++++++---
sandbox/memory/boost/detail/winapi/winbase.h | 2
sandbox/memory/boost/lockfree/tagged_ptr.hpp | 89 +++++++--------------------------------
3 files changed, 50 insertions(+), 81 deletions(-)
Modified: sandbox/memory/boost/detail/winapi/atomic/windows.hpp
==============================================================================
--- sandbox/memory/boost/detail/winapi/atomic/windows.hpp (original)
+++ sandbox/memory/boost/detail/winapi/atomic/windows.hpp 2008-05-13 17:18:31 EDT (Tue, 13 May 2008)
@@ -68,23 +68,47 @@
#endif
// -------------------------------------------------------------------------
+// TaggedCompareAndSwap
-__forceinline bool WINAPI CompareAndSwap64(
- PLONG64 Destination, LONG64 Exchange, LONG64 Comperand)
+__forceinline bool WINAPI TaggedCompareAndSwap(
+ LONG32 Destination[2], LONG32 Exchange, LONG32 Comperand, LONG32 Tag)
{
bool ok;
__asm {
- mov eax, long ptr Comperand
- mov edx, long ptr Comperand + 4
- mov ebx, long ptr Exchange
- mov ecx, long ptr Exchange + 4
- mov edi, long ptr Destination
+ mov eax, Comperand
+ mov edx, Tag
+ mov ebx, Exchange
+ mov ecx, edx
+ inc ecx
+ mov edi, Destination
lock cmpxchg8b [edi]
- setz [ok]
+ setz ok
}
return ok;
}
+#if defined(_WIN32)
+
+template <class Type>
+__forceinline bool WINAPI TaggedCompareAndSwap(
+ Type* Destination[2], Type* Exchange, Type* Comperand, Type* Tag)
+{
+ return TaggedCompareAndSwap(
+ (LONG32*)Destination, (LONG32)Exchange, (LONG32)Comperand, (LONG32)Tag);
+}
+
+#elif defined(_WIN64)
+
+template <class Type>
+__forceinline bool WINAPI TaggedCompareAndSwap(
+ Type* Destination[2], Type* Exchange, Type* Comperand, Type* Tag)
+{
+ return TaggedCompareAndSwap(
+ (LONG64*)Destination, (LONG64)Exchange, (LONG64)Comperand, (LONG64)Tag);
+}
+
+#endif
+
// -------------------------------------------------------------------------
// $Log: $
Modified: sandbox/memory/boost/detail/winapi/winbase.h
==============================================================================
--- sandbox/memory/boost/detail/winapi/winbase.h (original)
+++ sandbox/memory/boost/detail/winapi/winbase.h 2008-05-13 17:18:31 EDT (Tue, 13 May 2008)
@@ -12,7 +12,7 @@
#ifndef BOOST_DETAIL_WINAPI_WINBASE_H
#define BOOST_DETAIL_WINAPI_WINBASE_H
-#if defined(_WIN32)
+#if defined(_WIN32) || defined(_WIN64)
#ifndef __wtypes_h__
#include <wtypes.h>
Modified: sandbox/memory/boost/lockfree/tagged_ptr.hpp
==============================================================================
--- sandbox/memory/boost/lockfree/tagged_ptr.hpp (original)
+++ sandbox/memory/boost/lockfree/tagged_ptr.hpp 2008-05-13 17:18:31 EDT (Tue, 13 May 2008)
@@ -1,5 +1,5 @@
//
-// boost/lockfree/tagged_ptr.hpp
+// boost/lockfree/tagged.hpp
//
// Copyright (c) 2004 - 2008 xushiwei (xushiweizh_at_[hidden])
//
@@ -32,105 +32,50 @@
#define BOOST_LOCKFREE_CALL
#endif
-#if defined(_WIN32) || defined(__BIT32__)
-#define NS_BOOST_LOCKFREE_BIT32
-#elif defined(_WIN64) || defined(__BIT64__) || defined(__x86_64__)
-#define NS_BOOST_LOCKFREE_BIT64
-#else
-#error "Unknown Configurations"
-#endif
-
NS_BOOST_LOCKFREE_BEGIN
// -------------------------------------------------------------------------
-// class tagged_ptr
+// class tagged
-#if defined(NS_BOOST_LOCKFREE_BIT32)
-
-template <class Type>
+template <class E>
class tagged_ptr
{
private:
- LONG64 m_p;
+ typedef E* Type;
+ Type m_p[2];
public:
- tagged_ptr() : m_p(0) {}
+ tagged_ptr(Type vInit = Type()) {
+ m_p[0] = vInit;
+ }
template <class FuncT>
bool BOOST_LOCKFREE_CALL set(FuncT& op)
{
- BOOST_DETAIL_ASSERT(sizeof(Type*) == sizeof(LONG32));
- for (;;)
- {
- tagged_ptr vOld = *this;
- Type* pOld = vOld.get();
- if (!op.valid(pOld))
- return false;
-
- tagged_ptr vNew = vOld;
- vNew.m_p += (LONG64)1 << 32;
- *(LONG32*)&vNew.m_p = (LONG32)static_cast<Type*>(op(pOld));
- if (CompareAndSwap64(&m_p, vNew.m_p, vOld.m_p))
- return true;
- }
- }
-
- __forceinline Type* BOOST_LOCKFREE_CALL clear()
- {
- return (Type*)InterlockedExchangePointer((PVOID*)&m_p, NULL);
- }
-
- __forceinline Type* BOOST_LOCKFREE_CALL get() const
- {
- return (Type*)(LONG32)m_p;
- }
-};
-
-#elif defined(NS_BOOST_LOCKFREE_BIT64)
-
-template <class Type>
-class tagged_ptr
-{
-private:
- ATOMIC_LONG128 m_p;
-
-public:
- tagged_ptr() : m_p(0) {}
-
- template <class FuncT>
- bool BOOST_LOCKFREE_CALL set(FuncT op)
- {
- BOOST_DETAIL_ASSERT(sizeof(Type*) == sizeof(LONG64));
for (;;)
{
- tagged_ptr vOld = *this;
- Type* pOld = vOld.get();
- if (!op.valid(pOld))
+ Type vTag = m_p[1]; // NOTE: getting 'tag' before getting 'data'!
+ Type vOld = get();
+ if (!op.valid(vOld))
return false;
- tagged_ptr vNew = vOld;
- vNew.m_p += (ATOMIC_LONG128)1 << 64;
- *(LONG64*)&vNew.m_p = (LONG64)static_cast<Type*>(op(pOld));
- if (CompareAndSwap128(&m_p, vNew.m_p, vOld.m_p))
+ Type vNew = op(vOld);
+ if (TaggedCompareAndSwap(m_p, vNew, vOld, vTag))
return true;
}
}
- __forceinline Type* BOOST_LOCKFREE_CALL clear()
+ __forceinline Type BOOST_LOCKFREE_CALL clear()
{
- return (Type*)InterlockedExchangePointer((PVOID*)&m_p, NULL);
+ return (Type)InterlockedExchangePointer((PVOID*)m_p, NULL);
}
- __forceinline Type* BOOST_LOCKFREE_CALL get() const
+ __forceinline Type BOOST_LOCKFREE_CALL get() const
{
- return (Type*)(LONG64)m_p;
+ return m_p[0];
}
};
-#else
-#error "Unknown Configurations"
-#endif
-
// -------------------------------------------------------------------------
// $Log: $
Boost-Commit list run by bdawes at acm.org, david.abrahams at rcn.com, gregod at cs.rpi.edu, cpdaniel at pacbell.net, john at johnmaddock.co.uk