$include_dir="/home/hyper-archives/boost-commit/include"; include("$include_dir/msg-header.inc") ?>
Subject: [Boost-commit] svn:boost r56728 - in sandbox/stm/branches/vbe/boost: . stm stm/detail stm/non_tx/detail
From: vicente.botet_at_[hidden]
Date: 2009-10-12 02:32:39
Author: viboes
Date: 2009-10-12 02:32:37 EDT (Mon, 12 Oct 2009)
New Revision: 56728
URL: http://svn.boost.org/trac/boost/changeset/56728
Log:
TBoost.Stm vbe
* Adding transaction specific memory managers
* Adding shallow copy transactional object mixin
Added:
   sandbox/stm/branches/vbe/boost/stm/shallow_transaction_object.hpp   (contents, props changed)
Text files modified: 
   sandbox/stm/branches/vbe/boost/stm.hpp                          |     1                                         
   sandbox/stm/branches/vbe/boost/stm/base_transaction_object.hpp  |     6 -                                       
   sandbox/stm/branches/vbe/boost/stm/cache_fct.hpp                |     6                                         
   sandbox/stm/branches/vbe/boost/stm/detail/config.hpp            |    12 +-                                      
   sandbox/stm/branches/vbe/boost/stm/detail/monotonic_storage.hpp |     2                                         
   sandbox/stm/branches/vbe/boost/stm/detail/transaction_impl.hpp  |    18 +++++                                   
   sandbox/stm/branches/vbe/boost/stm/non_tx/detail/cache_map.hpp  |    45 +++++++++++++-                          
   sandbox/stm/branches/vbe/boost/stm/transaction.hpp              |   123 +++++++++++---------------------------- 
   sandbox/stm/branches/vbe/boost/stm/transaction_object.hpp       |    63 ++++++++++++++++----                    
   sandbox/stm/branches/vbe/boost/stm/transactional_object.hpp     |    65 +++++++++++++++-----                    
   10 files changed, 202 insertions(+), 139 deletions(-)
Modified: sandbox/stm/branches/vbe/boost/stm.hpp
==============================================================================
--- sandbox/stm/branches/vbe/boost/stm.hpp	(original)
+++ sandbox/stm/branches/vbe/boost/stm.hpp	2009-10-12 02:32:37 EDT (Mon, 12 Oct 2009)
@@ -46,6 +46,7 @@
 #include <boost/stm/move.hpp>
 #include <boost/stm/non_tx/numeric.hpp>
 #include <boost/stm/non_tx/smart_ptr.hpp>
+#include <boost/stm/shallow_transaction_object.hpp>
 #include <boost/stm/synchro.hpp>
 #include <boost/stm/transaction.hpp>
 #include <boost/stm/transaction_bookkeeping.hpp>
Modified: sandbox/stm/branches/vbe/boost/stm/base_transaction_object.hpp
==============================================================================
--- sandbox/stm/branches/vbe/boost/stm/base_transaction_object.hpp	(original)
+++ sandbox/stm/branches/vbe/boost/stm/base_transaction_object.hpp	2009-10-12 02:32:37 EDT (Mon, 12 Oct 2009)
@@ -47,7 +47,7 @@
 // transactional objets must specialize the pure virtual functions
 //      copy_state(base_transaction_object const * const rhs)
 //      move_state(base_transaction_object * rhs) if BUILD_MOVE_SEMANTICS
-//      cache_deallocate() if BOOST_STM_USE_MEMCOPY
+//      cache_deallocate()
 // copy_state is used to copy the backup/working copy to the shared transactional object when the roolback/commit is done direct/defered policy is used
 // move_state is used to move the backup/working copy to the shared transactional object when the roolback/commit is done direct/defered policy is used
 // cache_deallocate is used to release the backup/working copy when the transaction ends if direct/defered policy is used
@@ -75,7 +75,7 @@
    {}
 #endif
 
-   virtual base_transaction_object* clone() const = 0;
+   virtual base_transaction_object* clone(transaction* t) const = 0;
    virtual void copy_state(base_transaction_object const * const rhs) = 0;
 #if BUILD_MOVE_SEMANTICS
    virtual void move_state(base_transaction_object * rhs) = 0;
@@ -83,9 +83,7 @@
    virtual void move_state(base_transaction_object * rhs) {};
 #endif
    virtual ~base_transaction_object() {};
-#ifdef BOOST_STM_USE_MEMCOPY
     virtual void cache_deallocate()=0;
-#endif
 
    void transaction_thread(size_t rhs) const { transactionThread_ = rhs; }
    size_t const & transaction_thread() const { return transactionThread_; }
Modified: sandbox/stm/branches/vbe/boost/stm/cache_fct.hpp
==============================================================================
--- sandbox/stm/branches/vbe/boost/stm/cache_fct.hpp	(original)
+++ sandbox/stm/branches/vbe/boost/stm/cache_fct.hpp	2009-10-12 02:32:37 EDT (Mon, 12 Oct 2009)
@@ -36,17 +36,17 @@
 //-----------------------------------------------------------------------------
 
 class base_transaction_object;
+class transaction;
 
 template <class T> T* cache_clone(const T& val);
 template <class T> void cache_copy(const T* const ori, T* target);
 void cache_release(base_transaction_object* ptr);
 
-template <class T> inline T* cache_clone_constructor(const T&);
+//template <class T> inline T* cache_clone_constructor(const T&);
 
-template <class T> T* cache_allocate();
+template <class T> T* cache_allocate(transaction*);
 template <class T> void cache_deallocate(T*);
 
-class transaction;
 
 } // namespace core
 }
Modified: sandbox/stm/branches/vbe/boost/stm/detail/config.hpp
==============================================================================
--- sandbox/stm/branches/vbe/boost/stm/detail/config.hpp	(original)
+++ sandbox/stm/branches/vbe/boost/stm/detail/config.hpp	2009-10-12 02:32:37 EDT (Mon, 12 Oct 2009)
@@ -34,8 +34,9 @@
 //      OTHER: each TSS data has its specific TSS
 
 #define USE_SINGLE_THREAD_CONTEXT_MAP 1
-#define BOOST_STM_HAVE_SINGLE_TSS_CONTEXT_MAP 1
-
+//#define BOOST_STM_HAVE_SINGLE_TSS_CONTEXT_MAP 1
+ 
+ 
 ///////////////////////////////////////////////////////////////////////////////
 // When USE_SINGLE_THREAD_CONTEXT_MAP or BOOST_STM_HAVE_SINGLE_TSS_CONTEXT_MAP are defined you can want to store references to the TSS or not
 //      BOOST_STM_TX_CONTAINS_REFERENCES_TO_TSS_FIELDS if you want to add these references
@@ -56,15 +57,14 @@
 #define BOOST_STM_CM_STATIC_CONF_except_and_back_off_on_abort_notice_cm 1
 
 ///////////////////////////////////////////////////////////////////////////////
-// BOOST_STM_USE_MEMCOPY: STM uses memcpy insted of the copy constructor
-#define BOOST_STM_USE_MEMCOPY 1
+// BOOST_STM_USE_SPECIFIC_TRANSACTION_MEMORY_MANAGER
+//#define BOOST_STM_USE_SPECIFIC_TRANSACTION_MEMORY_MANAGER 1
 
-//// The cache using memcpy can use the following memory managers
+//// The cache using BOOST_STM_USE_SPECIFIC_TRANSACTION_MEMORY_MANAGER can use the following memory managers
 //// BOOST_STM_CACHE_USE_MALLOC: uses malloc/free
 //// BOOST_STM_CACHE_USE_MEMORY_MANAGER: uses the class specific memory manager
 //// BOOST_STM_CACHE_USE_TSS_MONOTONIC_MEMORY_MANAGER: uses the monotonic storage memory manager
 
-
 #define BOOST_STM_CACHE_USE_MALLOC  1
 //#define BOOST_STM_CACHE_USE_MEMORY_MANAGER 1
 //#define BOOST_STM_CACHE_USE_TSS_MONOTONIC_MEMORY_MANAGER  1
Modified: sandbox/stm/branches/vbe/boost/stm/detail/monotonic_storage.hpp
==============================================================================
--- sandbox/stm/branches/vbe/boost/stm/detail/monotonic_storage.hpp	(original)
+++ sandbox/stm/branches/vbe/boost/stm/detail/monotonic_storage.hpp	2009-10-12 02:32:37 EDT (Mon, 12 Oct 2009)
@@ -18,7 +18,7 @@
 
 namespace boost { namespace stm {
 
-#if defined(BOOST_STM_USE_MEMCOPY) && defined(BOOST_STM_CACHE_USE_TSS_MONOTONIC_MEMORY_MANAGER)
+#if defined(BOOST_STM_CACHE_USE_TSS_MONOTONIC_MEMORY_MANAGER)
 //-----------------------------------------------------------------------------
 //-----------------------------------------------------------------------------
    template <std::size_t size>
Modified: sandbox/stm/branches/vbe/boost/stm/detail/transaction_impl.hpp
==============================================================================
--- sandbox/stm/branches/vbe/boost/stm/detail/transaction_impl.hpp	(original)
+++ sandbox/stm/branches/vbe/boost/stm/detail/transaction_impl.hpp	2009-10-12 02:32:37 EDT (Mon, 12 Oct 2009)
@@ -721,7 +721,7 @@
       invalidating_deferred_end_transaction();
 #endif
    }
-#if defined(BOOST_STM_USE_MEMCOPY) && defined(BOOST_STM_CACHE_USE_TSS_MONOTONIC_MEMORY_MANAGER)
+#if defined(BOOST_STM_CACHE_USE_TSS_MONOTONIC_MEMORY_MANAGER)
     context_.mstorage_.reset();
 #endif
 }
@@ -834,6 +834,7 @@
    // this is an optimization to check forced to abort before obtaining the
    // transaction mutex, so if we do need to abort we do it now
    //--------------------------------------------------------------------------
+    //std::cout << __LINE__ << " invalidating_deferred_end_transaction" << std::endl;
 #ifndef DELAY_INVALIDATION_DOOMED_TXS_UNTIL_COMMIT
    if (forced_to_abort())
    {
@@ -850,12 +851,14 @@
    //--------------------------------------------------------------------------
    if (is_only_reading())
    {
+    //std::cout << __LINE__ << " invalidating_deferred_end_transaction" << std::endl;
       lock(inflight_lock());
       transactionsInFlight_.erase(this);
 
 #if PERFORMING_COMPOSITION
       if (other_in_flight_same_thread_transactions())
       {
+    //std::cout << __LINE__ << " invalidating_deferred_end_transaction" << std::endl;
       unlock(inflight_lock());
          state_ = e_hand_off;
          bookkeeping_.inc_handoffs();
@@ -863,6 +866,7 @@
       else
 #endif
       {
+    //std::cout << __LINE__ << " invalidating_deferred_end_transaction" << std::endl;
       unlock(inflight_lock());
          tx_type(eNormalTx);
 #if PERFORMING_LATM
@@ -871,12 +875,16 @@
 #endif
          state_ = e_committed;
       }
+    //std::cout << __LINE__ << " invalidating_deferred_end_transaction" << std::endl;
       ++global_clock();
+    //std::cout << __LINE__ << " invalidating_deferred_end_transaction" << std::endl;
 
       return;
    }
 
-   while (0 != trylock(&transactionMutex_)) { }
+   while (0 != trylock(&transactionMutex_)) { 
+    //std::cout << __LINE__ << " invalidating_deferred_end_transaction" << std::endl;
+    }
 
    //--------------------------------------------------------------------------
    // as much as I'd like to transactionsInFlight_.erase() here, we have
@@ -885,6 +893,7 @@
    // anyway. so we actually lose performance by doing it here and then
    // doing it again inside abort()
    //--------------------------------------------------------------------------
+    //std::cout << __LINE__ << " invalidating_deferred_end_transaction" << std::endl;
    if (forced_to_abort())
    {
       unlock(general_lock());
@@ -907,12 +916,14 @@
       // al threads, because aborted threads will try to obtain the
       // transactionsInFlightMutex
       //-----------------------------------------------------------------------
+    //std::cout << __LINE__ << " invalidating_deferred_end_transaction" << std::endl;
       lock_all_mutexes();
       lock(inflight_lock());
 
 #if PERFORMING_COMPOSITION
       if (other_in_flight_same_thread_transactions())
       {
+    //std::cout << __LINE__ << " invalidating_deferred_end_transaction" << std::endl;
          transactionsInFlight_.erase(this);
          state_ = e_hand_off;
          unlock_all_mutexes();
@@ -924,10 +935,13 @@
 #endif
       {
          // commit releases the inflight mutex as soon as its done with it
+    //std::cout << __LINE__ << " invalidating_deferred_end_transaction" << std::endl;
          invalidating_deferred_commit();
       }
 
+    //std::cout << __LINE__ << " invalidating_deferred_end_transaction" << std::endl;
       ++global_clock();
+    //std::cout << __LINE__ << " invalidating_deferred_end_transaction" << std::endl;
    }
 }
 
Modified: sandbox/stm/branches/vbe/boost/stm/non_tx/detail/cache_map.hpp
==============================================================================
--- sandbox/stm/branches/vbe/boost/stm/non_tx/detail/cache_map.hpp	(original)
+++ sandbox/stm/branches/vbe/boost/stm/non_tx/detail/cache_map.hpp	2009-10-12 02:32:37 EDT (Mon, 12 Oct 2009)
@@ -58,22 +58,34 @@
     inline T * get() {
         return ptr_;
     }
-    virtual base_transaction_object* clone() const {
+
+#if BOOST_STM_USE_SPECIFIC_TRANSACTION_MEMORY_MANAGER
+    virtual base_transaction_object* clone(transaction* t) const {
+        cache* tmp = new(t) cache<T>(*this);
+#else
+    virtual base_transaction_object* clone(transaction*) const {
         cache* tmp = new cache<T>(*this);
+#endif
         if (tmp->value_!=0) {
             tmp->ptr_ = new T(*value_);
         }
         return tmp;
     }
 
-#ifdef BOOST_STM_USE_MEMCOPY
+#if BOOST_STM_USE_SPECIFIC_TRANSACTION_MEMORY_MANAGER
+    virtual void cache_deallocate() {
+        delete ptr_;
+        ptr_=0;
+        this->~cache<T>();
+        boost::stm::cache_deallocate(this);
+    }
+#else
     virtual void cache_deallocate() {
         delete ptr_;
         ptr_=0;
         delete this;
     }
-#endif
-
+#endif    
     virtual void copy_state(base_transaction_object const * const rhs) {
         if (value_==0) return;
         *value_= *(static_cast<cache<T> const * const>(rhs)->ptr_);
@@ -81,6 +93,29 @@
         ptr_=0;
     }
 
+#if BOOST_STM_USE_SPECIFIC_TRANSACTION_MEMORY_MANAGER
+   void* operator new(size_t size, transaction* t) 
+   {
+      return boost::stm::cache_allocate<cache<T> >(t);
+   }   
+#if USE_STM_MEMORY_MANAGER
+   void* operator new(size_t size) throw ()
+   {
+      return retrieve_mem(size);
+   }
+
+   void operator delete(void* mem)
+   {
+      return_mem(mem, sizeof(cache<T>));
+   }
+#else   
+    void* operator new(size_t size) throw ()
+    {
+        return ::operator new(size);
+    }
+#endif
+#else
+
 #if USE_STM_MEMORY_MANAGER
    void* operator new(size_t size) throw ()
    {
@@ -92,6 +127,8 @@
       return_mem(mem, sizeof(cache<T>));
    }
 #endif
+#endif
+
 
 private:
     //cache(cache<T> const & r);
Added: sandbox/stm/branches/vbe/boost/stm/shallow_transaction_object.hpp
==============================================================================
--- (empty file)
+++ sandbox/stm/branches/vbe/boost/stm/shallow_transaction_object.hpp	2009-10-12 02:32:37 EDT (Mon, 12 Oct 2009)
@@ -0,0 +1,161 @@
+//////////////////////////////////////////////////////////////////////////////
+//
+// (C) Copyright Justin E. Gottchlich 2009.
+// (C) Copyright Vicente J. Botet Escriba 2009.
+// Distributed under the Boost
+// Software License, Version 1.0.
+// (See accompanying file LICENSE_1_0.txt or
+// copy at http://www.boost.org/LICENSE_1_0.txt)
+//
+// See http://www.boost.org/libs/stm for documentation.
+//
+//////////////////////////////////////////////////////////////////////////////
+
+#ifndef BOOST_STM_SHALLOW_TRANSACTION_OBJECT__HPP
+#define BOOST_STM_SHALLOW_TRANSACTION_OBJECT__HPP
+
+//-----------------------------------------------------------------------------
+//#include <stdarg.h>
+#include <pthread.h>
+//-----------------------------------------------------------------------------
+#include <list>
+//-----------------------------------------------------------------------------
+#include <boost/stm/detail/config.hpp>
+//-----------------------------------------------------------------------------
+#include <boost/stm/base_transaction_object.hpp>
+#include <boost/stm/cache_fct.hpp>
+#include <boost/stm/datatypes.hpp>
+//-----------------------------------------------------------------------------
+//-----------------------------------------------------------------------------
+//-----------------------------------------------------------------------------
+//-----------------------------------------------------------------------------
+
+//-----------------------------------------------------------------------------
+namespace boost { namespace stm {
+
+//-----------------------------------------------------------------------------
+// forward declarations
+//-----------------------------------------------------------------------------
+class transaction;
+    
+//-----------------------------------------------------------------------------
+//-----------------------------------------------------------------------------
+//-----------------------------------------------------------------------------
+// transaction object mixin making shallow copy
+// Provides the definition of the virtual functions
+//      clone: use copy constructor
+//      copy_state: use assignement
+//      move_state and
+//      cache_deallocate: use delete
+// Defines in addition the functions new and delete when USE_STM_MEMORY_MANAGER is defined
+
+// The parameter Base=base_transaction_object allows to mic transaction_object and polymorphism
+// class B : transaction_object<B> {}
+// class D : transaction_object<D, B> {}
+// the single issue is the forward constructors from transaction_object<D, B> to B
+//-----------------------------------------------------------------------------
+
+template <class Derived, typename Base=base_transaction_object>
+class shallow_transaction_object : public base_transaction_object
+{
+public:
+
+    //--------------------------------------------------------------------------
+    virtual base_transaction_object* clone(transaction* t) const {
+        Derived* tmp = cache_clone(t, *static_cast<Derived const*>(this));
+        return tmp;
+    }
+    
+   //--------------------------------------------------------------------------
+    virtual void cache_deallocate() {
+        boost::stm::cache_deallocate(this);
+    }
+    
+   //--------------------------------------------------------------------------
+   virtual void copy_state(base_transaction_object const * const rhs)
+   {
+        boost::stm::cache_copy(static_cast<Derived const * const>(rhs), static_cast<Derived *>(this));
+   }
+
+#if BUILD_MOVE_SEMANTICS
+   virtual void move_state(base_transaction_object * rhs)
+   {
+      static_cast<Derived &>(*this) = draco_move
+         (*(static_cast<Derived*>(rhs)));
+   }
+#endif
+
+
+#if USE_STM_MEMORY_MANAGER
+   void* operator new(size_t size) throw ()
+   {
+      return retrieve_mem(size);
+   }
+
+   void operator delete(void* mem)
+   {
+      static Derived elem;
+      static size_t elemSize = sizeof(elem);
+      return_mem(mem, elemSize);
+   }
+#endif
+
+};
+
+template <typename T> class shallow_native_trans :
+public shallow_transaction_object< shallow_native_trans<T> >
+{
+public:
+
+   shallow_native_trans() : value_(T()) {}
+   shallow_native_trans(T const &rhs) : value_(rhs) {}
+   shallow_native_trans(shallow_native_trans const &rhs) : value_(rhs.value_) {}
+   ~shallow_native_trans() {}
+
+   shallow_native_trans& operator=(T const &rhs) { value_ = rhs; return *this; }
+
+   shallow_native_trans& operator--() { --value_; return *this; }
+   shallow_native_trans operator--(int) { shallow_native_trans n = *this; --value_; return n; }
+
+   shallow_native_trans& operator++() { ++value_; return *this; }
+   shallow_native_trans operator++(int) { shallow_native_trans n = *this; ++value_; return n; }
+
+   shallow_native_trans& operator+=(T const &rhs)
+   {
+      value_ += rhs;
+      return *this;
+   }
+
+   shallow_native_trans operator+(shallow_native_trans const &rhs)
+   {
+      shallow_native_trans ret = *this;
+      ret.value_ += rhs.value_;
+      return ret;
+   }
+
+   //template <>
+   operator T() const
+   {
+      return this->value_;
+   }
+
+#if BUILD_MOVE_SEMANTICS
+   //--------------------------------------------------
+   // move semantics
+   //--------------------------------------------------
+   shallow_native_trans(shallow_native_trans &&rhs) { value_ = rhs.value_;}
+   shallow_native_trans& operator=(shallow_native_trans &&rhs)
+   { value_ = rhs.value_; return *this; }
+#endif
+
+   T& value() { return value_; }
+   T const & value() const { return value_; }
+
+private:
+   T value_;
+};
+
+}}
+#endif // BOOST_STM_SHALLOW_TRANSACTION_OBJECT__HPP
+
+
Modified: sandbox/stm/branches/vbe/boost/stm/transaction.hpp
==============================================================================
--- sandbox/stm/branches/vbe/boost/stm/transaction.hpp	(original)
+++ sandbox/stm/branches/vbe/boost/stm/transaction.hpp	2009-10-12 02:32:37 EDT (Mon, 12 Oct 2009)
@@ -177,7 +177,7 @@
     #ifdef USE_SINGLE_THREAD_CONTEXT_MAP
     struct tx_context
     {
-        #if defined(BOOST_STM_USE_MEMCOPY) && defined(BOOST_STM_CACHE_USE_TSS_MONOTONIC_MEMORY_MANAGER)
+        #if defined(BOOST_STM_CACHE_USE_TSS_MONOTONIC_MEMORY_MANAGER)
         monotonic_storage<6*1000*1000> mstorage_;
         #endif
         MemoryContainerList newMem;
@@ -212,7 +212,6 @@
         #endif
         {
             // the current transaction is 0
-            //transactions_.push(static_cast<transaction*>(0));
             transactions_.push(0);
             #ifndef BOOST_STM_USE_BOOST_MUTEX
             pthread_mutex_init(&mutex_, 0);
@@ -738,52 +737,6 @@
    }
 
    //--------------------------------------------------------------------------
-   template <typename T>
-   T* new_memory(T*)
-   {
-      if (forced_to_abort())
-      {
-         if (!direct_updating())
-         {
-            deferred_abort(true);
-            throw aborted_tx("");
-         }
-
-#ifndef DELAY_INVALIDATION_DOOMED_TXS_UNTIL_COMMIT
-         cm_abort_on_new(*this);
-#endif
-      }
-      T *newNode = new T();
-      newNode->transaction_thread(threadId_);
-      newNode->new_memory(1);
-      newMemoryList().push_back(newNode);
-
-      return newNode;
-   }
-
-   //--------------------------------------------------------------------------
-   template <typename T>
-   T* new_memory_copy(T const &rhs)
-   {
-      if (forced_to_abort())
-      {
-         if (!direct_updating())
-         {
-            deferred_abort(true);
-            throw aborted_tx("");
-         }
-#ifndef DELAY_INVALIDATION_DOOMED_TXS_UNTIL_COMMIT
-         cm_abort_on_new(*this);
-#endif
-      }
-      T *newNode = new T(rhs);
-      newNode->transaction_thread(threadId_);
-      newNode->new_memory(1);
-      newMemoryList().push_back(newNode);
-
-      return newNode;
-   }
-
     void throw_if_forced_to_abort_on_new() {
         if (forced_to_abort()) {
             if (!direct_updating()) {
@@ -796,6 +749,7 @@
         }
     }
 
+   //--------------------------------------------------------------------------
    template <typename T>
    T* as_new(T *newNode)
    {
@@ -805,6 +759,22 @@
 
       return newNode;
    }
+   //--------------------------------------------------------------------------
+   template <typename T>
+   T* new_memory(T*)
+   {
+      throw_if_forced_to_abort_on_new();
+      return as_new(new T());
+   }
+
+   //--------------------------------------------------------------------------
+   template <typename T>
+   T* new_memory_copy(T const &rhs)
+   {
+      throw_if_forced_to_abort_on_new();
+      return as_new(new T(rhs));
+   }
+
 
    void begin();
    bool restart();
@@ -1028,7 +998,7 @@
       }
 
       in.transaction_thread(threadId_);
-      writeList().insert(tx_pair((base_transaction_object*)&in, in.clone()));
+      writeList().insert(tx_pair((base_transaction_object*)&in, in.clone(this)));
 #if USE_BLOOM_FILTER
       bloom().insert((size_t)&in);
 #endif
@@ -1171,7 +1141,7 @@
          wbloom().set_bv2(bloom().h2());
          //sm_wbv().set_bit((size_t)&in % sm_wbv().size());
 #endif
-         base_transaction_object* returnValue = in.clone();
+         base_transaction_object* returnValue = in.clone(this);
          returnValue->transaction_thread(threadId_);
          writeList().insert(tx_pair((base_transaction_object*)&in, returnValue));
 #ifndef USE_BLOOM_FILTER
@@ -1633,7 +1603,8 @@
     inline static TransactionsStack &transactions(thread_id_t id) {
         return *threadTransactionsStack_.find(id)->second;
     }
-   private:
+    private:
+
 
 ////////////////////////////////////////
 #else //BOOST_STM_HAVE_SINGLE_TSS_CONTEXT_MAP
@@ -1800,7 +1771,7 @@
         return i->second->transactions_;
     }
    private:
-   
+       
 #endif
 
 
@@ -1975,14 +1946,13 @@
 
 };
 
-#ifdef BOOST_STM_USE_MEMCOPY
-template <class T> T* cache_allocate() {
-    #if defined(BOOST_STM_CACHE_USE_MEMORY_MANAGER)
+template <class T> T* cache_allocate(transaction* t) {
+    #if defined(BOOST_STM_CACHE_USE_MEMORY_MANAGER) && defined (USE_STM_MEMORY_MANAGER)
     return  reinterpret_cast<T*>(T::retrieve_mem(sizeof(T)));
     #elif defined(BOOST_STM_CACHE_USE_MALLOC)
     return  reinterpret_cast<T*>(malloc(sizeof(T)));
     #elif defined(BOOST_STM_CACHE_USE_TSS_MONOTONIC_MEMORY_MANAGER)
-    return reinterpret_cast<T*>(context_.mstorage_.allocate<T>());
+    return reinterpret_cast<T*>(t->context_.mstorage_.allocate<T>());
     #else
     #error "BOOST_STM_CACHE_USE_MEMORY_MANAGER, BOOST_STM_CACHE_USE_MALLOC or BOOST_STM_CACHE_USE_TSS_MONOTONIC_MEMORY_MANAGER must be defined"
     #endif
@@ -2000,7 +1970,7 @@
 struct cache_deallocate {
     static void apply(T* ptr) {
         if (ptr) {
-        #if defined(BOOST_STM_CACHE_USE_MEMORY_MANAGER)
+        #if defined(BOOST_STM_CACHE_USE_MEMORY_MANAGER) && defined (USE_STM_MEMORY_MANAGER)
             base_transaction_object::return_mem(ptr,sizeof(T));
         #elif defined(BOOST_STM_CACHE_USE_MALLOC)
             free(ptr);
@@ -2023,7 +1993,7 @@
 template <class T>
 inline void cache_deallocate(T* ptr) {
     if (ptr) {
-    #if defined(BOOST_STM_CACHE_USE_MEMORY_MANAGER)
+    #if defined(BOOST_STM_CACHE_USE_MEMORY_MANAGER)  && defined (USE_STM_MEMORY_MANAGER
         base_transaction_object::return_mem(ptr,sizeof(T));
     #elif defined(BOOST_STM_CACHE_USE_MALLOC)
         free(ptr);
@@ -2034,17 +2004,11 @@
     }
 }
 #endif //BOOST_STM_NO_PARTIAL_SPECIALIZATION
-#endif // BOOST_STM_USE_MEMCOPY
 
 inline void cache_release(base_transaction_object* ptr) {
-#ifdef BOOST_STM_USE_MEMCOPY
     ptr->cache_deallocate();
-#else
-    delete ptr;
-#endif
 }
 
-#ifdef BOOST_STM_USE_MEMCOPY
 #ifdef BOOST_STM_NO_PARTIAL_SPECIALIZATION
 namespace partial_specialization_workaround {
 template <class T>
@@ -2052,8 +2016,8 @@
 
 template <class T>
 struct cache_clone {
-    static inline T* apply(const T& val) {
-        T* p = cache_allocate<T>();
+    static inline T* apply(transaction* t, const T& val) {
+        T* p = cache_allocate<T>(t);
         if (p==0) {
             throw std::bad_alloc();
         }
@@ -2065,14 +2029,14 @@
 } // partial_specialization_workaround
 
 template <class T>
-inline T* cache_clone(const T& val) {
-    return partial_specialization_workaround::cache_clone<T>::apply(val);
+inline T* cache_clone(transaction* t, const T& val) {
+    return partial_specialization_workaround::cache_clone<T>::apply(t, val);
 }
 #else //BOOST_STM_NO_PARTIAL_SPECIALIZATION
 
 template <class T>
-inline T* cache_clone(const T& val) {
-    T* p = cache_allocate<T>();
+inline T* cache_clone(transaction* t, const T& val) {
+    T* p = cache_allocate<T>(t);
     if (p==0) {
         throw std::bad_alloc();
     }
@@ -2080,21 +2044,11 @@
     return p;
 }
 #endif // BOOST_STM_NO_PARTIAL_SPECIALIZATION
-#else
-template <class T>
-inline T* cache_clone(const T& val) {
-    T* tmp=new T(val);
-    return tmp;
-}
-#endif
 
 
 template <class T> void cache_copy(const T* const ori, T* target);
-// When BOOST_STM_USE_MEMCOPY is defined
-// this function must be specialized for objects that are non transactional by deleting the object, e.g.
 
 #ifdef BOOST_STM_NO_PARTIAL_SPECIALIZATION
-#ifdef BOOST_STM_USE_MEMCOPY
 namespace partial_specialization_workaround {
 template <class T> struct cache_copy;
 
@@ -2107,24 +2061,15 @@
 };
 
 } // partial_specialization_workaround
-#endif
 
 template <class T> void cache_copy(const T* const ori, T* target) {
-#ifdef BOOST_STM_USE_MEMCOPY
     partial_specialization_workaround::cache_copy<T>::apply(ori, target);
-#else
-    *target=*ori;
-#endif
 }
 
 #else
 
 template <class T> void cache_copy(const T* const ori, T* target) {
-#ifdef BOOST_STM_USE_MEMCOPY
     memcpy(target, ori, sizeof(T));
-#else
-    *target=*ori;
-#endif
 }
 #endif
 
Modified: sandbox/stm/branches/vbe/boost/stm/transaction_object.hpp
==============================================================================
--- sandbox/stm/branches/vbe/boost/stm/transaction_object.hpp	(original)
+++ sandbox/stm/branches/vbe/boost/stm/transaction_object.hpp	2009-10-12 02:32:37 EDT (Mon, 12 Oct 2009)
@@ -43,9 +43,10 @@
 //-----------------------------------------------------------------------------
 // transaction object mixin
 // Provides the definition of the virtual functions
-//      copy_state: relaying on the cache_copy<T> generic function
+//      clone: use copy constructor
+//      copy_state: use assignement
 //      move_state and
-//      cache_deallocate: relaying on the cache_copy<T> generic function
+//      cache_deallocate: use delete
 // Defines in addition the functions new and delete when USE_STM_MEMORY_MANAGER is defined
 
 // The parameter Base=base_transaction_object allows to mic transaction_object and polymorphism
@@ -57,17 +58,37 @@
 class transaction_object : public base_transaction_object
 {
 public:
+    typedef transaction_object<Derived, Base> this_type;
 
     //--------------------------------------------------------------------------
-    virtual base_transaction_object* clone() const {
-        Derived* tmp = cache_clone(*static_cast<Derived const*>(this));
+#if BOOST_STM_USE_SPECIFIC_TRANSACTION_MEMORY_MANAGER
+    virtual base_transaction_object* clone(transaction* t) const {
+        Derived* tmp = new(t) Derived(*static_cast<Derived const*>(this));
         return tmp;
     }
+#else
+    virtual base_transaction_object* clone(transaction*) const {
+        Derived* tmp = new Derived(*static_cast<Derived const*>(this));
+        return tmp;
+    }
+#endif        
 
    //--------------------------------------------------------------------------
+#if BOOST_STM_USE_SPECIFIC_TRANSACTION_MEMORY_MANAGER
+    virtual void cache_deallocate() {
+        static_cast<Derived*>(this)->~Derived();
+        boost::stm::cache_deallocate(this);
+    }
+#else
+    virtual void cache_deallocate() {
+        delete this;
+    }
+#endif
+    
+   //--------------------------------------------------------------------------
    virtual void copy_state(base_transaction_object const * const rhs)
    {
-        boost::stm::cache_copy(static_cast<Derived const * const>(rhs), static_cast<Derived *>(this));
+       *static_cast<Derived *>(this) = *static_cast<Derived const * const>(rhs);
    }
 
 #if BUILD_MOVE_SEMANTICS
@@ -78,13 +99,30 @@
    }
 #endif
 
-#ifdef BOOST_STM_USE_MEMCOPY
-    virtual void cache_deallocate() {
-        boost::stm::cache_deallocate(this);
-    }
+#if BOOST_STM_USE_SPECIFIC_TRANSACTION_MEMORY_MANAGER
+   void* operator new(size_t size, transaction* t) 
+   {
+      return boost::stm::cache_allocate<Derived>(t);
+   }   
+#if USE_STM_MEMORY_MANAGER
+   void* operator new(size_t size) throw ()
+   {
+      return retrieve_mem(size);
+   }
 
+   void operator delete(void* mem)
+   {
+      static Derived elem;
+      static size_t elemSize = sizeof(elem);
+      return_mem(mem, elemSize);
+   }
+#else
+   void* operator new(size_t size) throw ()
+   {
+      return ::operator new(size);
+   }
 #endif
-
+#else  
 #if USE_STM_MEMORY_MANAGER
    void* operator new(size_t size) throw ()
    {
@@ -98,7 +136,7 @@
       return_mem(mem, elemSize);
    }
 #endif
-
+#endif
 };
 
 template <typename T> class native_trans :
@@ -154,8 +192,7 @@
    T value_;
 };
 
-} // namespace core
-}
+}}
 #endif // BOOST_STM_TRANSACTION_OBJECT__HPP
 
 
Modified: sandbox/stm/branches/vbe/boost/stm/transactional_object.hpp
==============================================================================
--- sandbox/stm/branches/vbe/boost/stm/transactional_object.hpp	(original)
+++ sandbox/stm/branches/vbe/boost/stm/transactional_object.hpp	2009-10-12 02:32:37 EDT (Mon, 12 Oct 2009)
@@ -71,33 +71,64 @@
         return *this;
     }
 
-    virtual base_transaction_object* clone() const {
+#if BOOST_STM_USE_SPECIFIC_TRANSACTION_MEMORY_MANAGER
+    virtual base_transaction_object* clone(transaction* t) const {
+        //return cache_clone(*this);
+        return new(t) transactional_object<T>(*this);
+    }
+#else
+    virtual base_transaction_object* clone(transaction*) const {
+        //return cache_clone(*this);
         return new transactional_object<T>(*this);
     }
-
-#ifdef BOOST_STM_USE_MEMCOPY
+#endif
+    
     virtual void cache_deallocate() {
         //boost::stm::cache_deallocate(this);
         delete this;
     }
-#endif
 
     virtual void copy_state(base_transaction_object const * const rhs) {
-        //cache_copy(static_cast<transactional_object<T> const * const>(rhs),                      this);
-         *this=*static_cast<transactional_object<T> const * const>(rhs);
+        //cache_copy(static_cast<transactional_object<T> const * const>(rhs), this);
+        *this=*static_cast<transactional_object<T> const * const>(rhs);
     }
 
-#if USE_STM_MEMORY_MANAGER
-   void* operator new(size_t size) throw ()
-   {
-      return retrieve_mem(size);
-   }
-
-   void operator delete(void* mem)
-   {
-      return_mem(mem, sizeof(transactional_object<T>));
-   }
-#endif
+    #if BOOST_STM_USE_SPECIFIC_TRANSACTION_MEMORY_MANAGER
+    void* operator new(size_t size, transaction* t) 
+    {
+        return cache_allocate<transactional_object<T> >(t);
+    }   
+    #if USE_STM_MEMORY_MANAGER
+    void* operator new(size_t size) throw ()
+    {
+        return retrieve_mem(size);
+    }
+
+    void operator delete(void* mem)
+    {
+    return_mem(mem, sizeof(transactional_object<T>));
+    }
+    #else
+    void* operator new(size_t size) throw ()
+    {
+        return ::operator new(size);
+    }
+    #endif
+
+    #else
+
+    #if USE_STM_MEMORY_MANAGER
+    void* operator new(size_t size) throw ()
+    {
+        return retrieve_mem(size);
+    }
+
+    void operator delete(void* mem)
+    {
+        return_mem(mem, sizeof(transactional_object<T>));
+    }
+    #endif
+    #endif
 
 };