$include_dir="/home/hyper-archives/boost-commit/include"; include("$include_dir/msg-header.inc") ?>
Subject: [Boost-commit] svn:boost r52714 - sandbox/stm/boost/stm/detail
From: justin_at_[hidden]
Date: 2009-05-01 23:41:03
Author: jgottschlich
Date: 2009-05-01 23:41:02 EDT (Fri, 01 May 2009)
New Revision: 52714
URL: http://svn.boost.org/trac/boost/changeset/52714
Log:
changed read and write transaction pointer implementations. at least temporarily removed upgradable pointer until Vicente and I can discuss it in more detail.
Text files modified: 
   sandbox/stm/boost/stm/detail/tx_ptr.hpp |    82 +++++++++++++-------------------------- 
   1 files changed, 27 insertions(+), 55 deletions(-)
Modified: sandbox/stm/boost/stm/detail/tx_ptr.hpp
==============================================================================
--- sandbox/stm/boost/stm/detail/tx_ptr.hpp	(original)
+++ sandbox/stm/boost/stm/detail/tx_ptr.hpp	2009-05-01 23:41:02 EDT (Fri, 01 May 2009)
@@ -23,11 +23,11 @@
 namespace boost { namespace stm {
 
 template <typename T>
-class tx_rd_ptr
+class read_ptr
 {
 public:
  
-   tx_rd_ptr(transaction &t, T const &tx_obj) : 
+   read_ptr(transaction &t, T const &tx_obj) : 
       t_(t), tx_ptr_(&const_cast<T&>(t_.read(tx_obj))), written_(false)
    {}
 
@@ -57,82 +57,54 @@
    T const & operator*() const { return *get(); }
    T const * operator->() const { return get(); }
 
-private:
-    
-   mutable transaction &t_;
-   mutable T *tx_ptr_;
-   mutable bool written_;
-};
-
-template <typename T>
-class tx_wr_ptr;
-
-template <typename T>
-class tx_upgrd_ptr
-{
-public:
- 
-   tx_upgrd_ptr(transaction &t, T & tx_obj) : 
-      t_(t), tx_obj_(const_cast<T&>(t_.read(tx_obj))), upgraded_(false)
-   {}
+   transaction &trans() { return t_; }
 
-   const T* get()
+   T* write_ptr()
    {
       if (t_.forced_to_abort()) 
       {
          t_.lock_and_abort();
          throw aborted_transaction_exception("aborting transaction");
       }
-      if (!upgraded_) {
-          T &new_tx_obj_=const_cast<T&>(t_.read(tx_obj_));
-          if (&new_tx_obj_!=&tx_obj_) {
-              tx_obj_=new_tx_obj_;
-              upgraded_=true;
-          }
-      }
-      return &tx_obj_;
-   }
 
-   const T& operator*()
-   {
-      return *get();
-   }
-
-   const T* operator->()
-   {
-      return get();
-   }
+      // we are already holding the written object
+      if (written_) return tx_ptr_;
 
+      T* temp = t_.get_written(*tx_ptr_);
+ 
+      // if we found something, store this as the tx_ptr_
+      if (0 != temp)
+      {
+         tx_ptr_ = temp;
+         written_ = true;
+      }
+      else
+      {
+         tx_ptr_ = &t_.write(*tx_ptr_);
+         written_ = true;
+      }
 
-   T& upgrade() {
-       tx_obj_=t_.write(tx_obj_);
-       upgraded_=true;
-       return tx_obj_;
+      return tx_ptr_;
    }
 
 private:
-   //template <typename TT> 
-   friend class tx_wr_ptr;
-
+    
    mutable transaction &t_;
-   mutable T &tx_obj_;
-   bool upgraded_;
+   mutable T *tx_ptr_;
+   mutable bool written_;
 };
 
-
+//-----------------------------------------------------------------------------
+//-----------------------------------------------------------------------------
 template <typename T>
-class tx_wr_ptr
+class write_ptr
 {
 public:
  
-   tx_wr_ptr(transaction &t, T & tx_obj) : 
+   write_ptr(transaction &t, T & tx_obj) : 
       t_(t), tx_obj_(t_.write(tx_obj))
    {}
 
-   tx_wr_ptr(tx_upgrd_ptr<T> &upgrd) : 
-      t_(upgrd.t_), tx_obj_(upgrd.upgrade())
-   {}
-
    T& operator*()
    {
       if (t_.forced_to_abort())