$include_dir="/home/hyper-archives/boost-commit/include"; include("$include_dir/msg-header.inc") ?>
Subject: [Boost-commit] svn:boost r56977 - in sandbox/stm/branches/vbe/boost/stm: . detail
From: vicente.botet_at_[hidden]
Date: 2009-10-18 08:27:01
Author: viboes
Date: 2009-10-18 08:27:00 EDT (Sun, 18 Oct 2009)
New Revision: 56977
URL: http://svn.boost.org/trac/boost/changeset/56977
Log:
TBoost.STM vbe: 
* Remove var_auto_lock as it is not exception safe
* Replace light_auto_lock by synchro::unique_lock
* BUG: improve the general lock when getting the transactions stack
Text files modified: 
   sandbox/stm/branches/vbe/boost/stm/detail/config.hpp           |     3                                         
   sandbox/stm/branches/vbe/boost/stm/detail/transaction_impl.hpp |     7                                         
   sandbox/stm/branches/vbe/boost/stm/synchro.hpp                 |   266 --------------------------------------- 
   sandbox/stm/branches/vbe/boost/stm/transaction.hpp             |    37 ++---                                   
   4 files changed, 24 insertions(+), 289 deletions(-)
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-18 08:27:00 EDT (Sun, 18 Oct 2009)
@@ -34,7 +34,7 @@
 //      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
 
 
 ///////////////////////////////////////////////////////////////////////////////
@@ -102,6 +102,7 @@
 #define BOOST_STM_ALLOWS_DELETERS 1
 
 #define BOOST_STM_USE_BOOST_SYNCHRO 1
+
 #endif // BOOST_STM_DETAIL_CONFIG_H
 
 
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-18 08:27:00 EDT (Sun, 18 Oct 2009)
@@ -396,7 +396,7 @@
 inline transaction::transaction() :
    threadId_(THREAD_ID),
    //transactionMutexLocker_(),
-   auto_general_lock_(general_lock()),
+   auto_general_lock_(*general_lock()),
 
 #if USE_SINGLE_THREAD_CONTEXT_MAP
 ////////////////////////////////////////
@@ -444,7 +444,7 @@
    currentlyLockedLocksRef_(*threadCurrentlyLockedLocks_.find(threadId_)->second),
 #endif
 #endif
-   transactionsRef_(transactions(threadId_)),
+   transactionsRef_(transactions_unsafe(threadId_)),
 
 ////////////////////////////////////////
 #else
@@ -481,7 +481,7 @@
    currentlyLockedLocksRef_(*threadCurrentlyLockedLocks_.find(threadId_)->second),
 #endif
 ////////////////////////////////////////
-   transactionsRef_(transactions(threadId_)),
+   transactionsRef_(transactions_unsafe(threadId_)),
 
 #endif
 
@@ -491,6 +491,7 @@
    reads_(0),
    startTime_(time(0))
 {
+   auto_general_lock_.unlock();
    if (direct_updating()) doIntervalDeletions();
 #if PERFORMING_LATM
    while (blocked()) { SLEEP(10) ; }
Modified: sandbox/stm/branches/vbe/boost/stm/synchro.hpp
==============================================================================
--- sandbox/stm/branches/vbe/boost/stm/synchro.hpp	(original)
+++ sandbox/stm/branches/vbe/boost/stm/synchro.hpp	2009-10-18 08:27:00 EDT (Sun, 18 Oct 2009)
@@ -45,6 +45,8 @@
    typedef boost::mutex Mutex;
 #endif
 
+typedef pthread_mutex_t PLOCK;
+
 //-----------------------------------------------------------------------------
 
 namespace boost { 
@@ -86,17 +88,6 @@
         return lockable.try_lock();
     }
 
-#ifdef BOOST_PTHREAD_HAS_TIMEDLOCK
-    template <typename Lockable, typename TimeDuration >
-    bool lock_for(Lockable& lockable, const TimeDuration& rel_time) {
-        return lock_until(&lockable, get_system_time()+rel_time);
-    }
-    
-    template< typename Lockable>
-    inline bool lock_until(Lockable& lockable, system_time const& target_time) {
-        return lockable.timed_lock(target_time);
-    }
-#endif
     template<>
     inline void lock<pthread_mutex_t>(pthread_mutex_t& lockable) {
         pthread_mutex_lock(&lockable);
@@ -112,18 +103,6 @@
         return pthread_mutex_trylock(&lockable);
     }
 
-#ifdef BOOST_PTHREAD_HAS_TIMEDLOCK
-    template<>
-    inline bool lock_until<pthread_mutex_t>(
-                pthread_mutex_t& lockable, system_time const& abs_time) {
-        struct timespec const timeout=boost::detail::get_timespec(abs_time);
-        int const res=pthread_mutex_timedlock(&lockable,&timeout);
-        //BOOST_ASSERT(!res || res==ETIMEDOUT);
-        return !res;
-    }
-#endif       
-
-
     template<typename Mutex>
     class lock_guard
     {
@@ -203,89 +182,12 @@
         {
             try_lock();
         }
-#ifdef BOOST_PTHREAD_HAS_TIMEDLOCK
-        template<typename TimeDuration>
-        unique_lock(Mutex& m_,TimeDuration const& target_time):
-            m(&m_),is_locked(false)
-        {
-            timed_lock(target_time);
-        }
-        unique_lock(Mutex& m_,boost::system_time const& target_time):
-            m(&m_),is_locked(false)
-        {
-            timed_lock(target_time);
-        }
-#endif        
-#if 0        
-#ifdef BOOST_HAS_RVALUE_REFS
-        unique_lock(unique_lock&& other):
-            m(other.m),is_locked(other.is_locked)
-        {
-            other.is_locked=false;
-            other.m=0;
-        }
-        unique_lock<Mutex>&& move()
-        {
-            return static_cast<unique_lock<Mutex>&&>(*this);
-        }
-
-
-        unique_lock& operator=(unique_lock<Mutex>&& other)
-        {
-            unique_lock temp(other);
-            swap(temp);
-            return *this;
-        }
-
-        void swap(unique_lock&& other)
-        {
-            std::swap(m,other.m);
-            std::swap(is_locked,other.is_locked);
-        }
-#else
-        unique_lock(detail::thread_move_t<unique_lock<Mutex> > other):
-            m(other->m),is_locked(other->is_locked)
-        {
-            other->is_locked=false;
-            other->m=0;
-        }
-
-        operator detail::thread_move_t<unique_lock<Mutex> >()
-        {
-            return move();
-        }
-
-        detail::thread_move_t<unique_lock<Mutex> > move()
-        {
-            return detail::thread_move_t<unique_lock<Mutex> >(*this);
-        }
-
-        unique_lock& operator=(detail::thread_move_t<unique_lock<Mutex> > other)
-        {
-            unique_lock temp(other);
-            swap(temp);
-            return *this;
-        }
-
-        void swap(unique_lock& other)
-        {
-            std::swap(m,other.m);
-            std::swap(is_locked,other.is_locked);
-        }
-        void swap(detail::thread_move_t<unique_lock<Mutex> > other)
-        {
-            std::swap(m,other->m);
-            std::swap(is_locked,other->is_locked);
-        }
-#endif
-#else
         void swap(unique_lock& other)
         {
             std::swap(m,other.m);
             std::swap(is_locked,other.is_locked);
         }
         
-#endif        
         ~unique_lock()
         {
             if(owns_lock())
@@ -311,25 +213,6 @@
             is_locked=synchro::try_lock(*m);
             return is_locked;
         }
-#ifdef BOOST_PTHREAD_HAS_TIMEDLOCK
-        template<typename TimeDuration>
-        bool timed_lock(TimeDuration const& relative_time)
-        {
-            is_locked=synchro::timed_lock(*m, relative_time);
-            return is_locked;
-        }
-        
-        bool timed_lock(::boost::system_time const& absolute_time)
-        {
-            is_locked=synchro::timed_lock(*m, absolute_time);
-            return is_locked;
-        }
-        bool timed_lock(::boost::xtime const& absolute_time)
-        {
-            is_locked=synchro::timed_lock(*m, absolute_time);
-            return is_locked;
-        }
-#endif        
         void unlock()
         {
             if(!owns_lock())
@@ -368,158 +251,15 @@
         }
     };
 
-#if 0
-#ifdef BOOST_HAS_RVALUE_REFS
-    template<typename Mutex>
-    void swap(unique_lock<Mutex>&& lhs,unique_lock<Mutex>&& rhs)
-    {
-        lhs.swap(rhs);
-    }
-#else
-    template<typename Mutex>
-    void swap(unique_lock<Mutex>& lhs,unique_lock<Mutex>& rhs)
-    {
-        lhs.swap(rhs);
-    }
-#endif
-#else
     template<typename Mutex>
     void swap(unique_lock<Mutex>& lhs,unique_lock<Mutex>& rhs)
     {
         lhs.swap(rhs);
-    }
-#endif    
-
-#if 0
-#ifdef BOOST_HAS_RVALUE_REFS
-    template<typename Mutex>
-    inline unique_lock<Mutex>&& move(unique_lock<Mutex>&& ul)
-    {
-        return ul;
-    }
-#endif
-#endif
-
-    
+    }   
 }
 #endif
 namespace stm {
 
-//-----------------------------------------------------------------------------
-// forward declarations
-//-----------------------------------------------------------------------------
-
-typedef pthread_mutex_t PLOCK;
-
-//-----------------------------------------------------------------------------
-//-----------------------------------------------------------------------------
-
-   inline int lock22(PLOCK &lock) { return pthread_mutex_lock(&lock); }
-   inline int lock22(PLOCK *lock) { return pthread_mutex_lock(lock); }
-
-   inline int trylock22(PLOCK &lock) { return pthread_mutex_trylock(&lock); }
-   inline int trylock22(PLOCK *lock) { return pthread_mutex_trylock(lock); }
-
-   inline int unlock22(PLOCK &lock) { return pthread_mutex_unlock(&lock); }
-   inline int unlock22(PLOCK *lock) { return pthread_mutex_unlock(lock); }
-
-
-//-----------------------------------------------------------------------------
-//-----------------------------------------------------------------------------
-
-//-----------------------------------------------------------------------------
-//-----------------------------------------------------------------------------
-
-class light_auto_lock
-{
-public:
-
-   light_auto_lock(Mutex &mutex) : lock_(0)
-   {
-      do_auto_lock(&mutex);
-   }
-
-   light_auto_lock(Mutex *mutex) : lock_(0)
-   {
-      do_auto_lock(mutex);
-   }
-
-   ~light_auto_lock() { do_auto_unlock(); }
-
-   bool has_lock() { return hasLock_; }
-
-   void release_lock() { do_auto_unlock(); }
-
-private:
-
-   void do_auto_lock(Mutex *mutex)
-   {
-      lock_ = mutex;
-      synchro::lock(*mutex);
-      hasLock_ = true;
-   }
-
-   void do_auto_unlock()
-   {
-      if (hasLock_)
-      {
-         hasLock_ = false;
-         synchro::unlock(*lock_);
-      }
-   }
-
-   bool hasLock_;
-   Mutex *lock_;
-};
-
-
-//-----------------------------------------------------------------------------
-//-----------------------------------------------------------------------------
-template <typename T>
-class var_auto_lock
-{
-public:
-
-   //--------------------------------------------------------------------------
-   typedef T lock_type;
-   typedef std::list<lock_type*> lock_list;
-
-   //--------------------------------------------------------------------------
-   var_auto_lock(lock_type *l, ...)
-   {
-      va_list ap;
-      va_start(ap, l);
-
-      while (l)
-      {
-         lockList_.push_back(l);
-         l = va_arg(ap, lock_type*);
-      }
-
-      va_end(ap);
-
-      std::list<PLOCK*>::iterator i = lockList_.begin();
-
-      for (; i != lockList_.end(); ++i)
-      {
-         synchro::lock(**i);
-      }
-   }
-
-   //--------------------------------------------------------------------------
-   ~var_auto_lock()
-   {
-      for (std::list<PLOCK*>::iterator i = lockList_.begin(); i != lockList_.end(); ++i)
-      {
-         synchro::unlock(**i);
-      }
-   }
-
-private:
-   std::list<lock_type*> lockList_;
-
-};
-
 
 } // namespace core
 }
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-18 08:27:00 EDT (Sun, 18 Oct 2009)
@@ -100,12 +100,6 @@
 
 typedef std::pair<base_transaction_object*, base_transaction_object*> tx_pair;
 
-   template <typename MUTEX, MUTEX& mtx>
-   struct locker {
-       inline locker();
-       inline ~locker();
-       inline void unlock();
-   };
 
 ///////////////////////////////////////////////////////////////////////////////
 // transaction Class
@@ -1512,8 +1506,7 @@
    //--------------------------------------------------------------------------
    size_t threadId_;
 
-   light_auto_lock auto_general_lock_;
-   //locker<Mutex, transactionMutex_> transactionMutexLocker_;
+   synchro::unique_lock<Mutex> auto_general_lock_;
 
    //--------------------------------------------------------------------------
    // ******** WARNING ******** MOVING threadId_ WILL BREAK TRANSACTION.
@@ -1684,7 +1677,11 @@
    public:
     inline TransactionsStack& transactions() {return transactionsRef_;}
     inline static TransactionsStack &transactions(thread_id_t id) {
-        light_auto_lock auto_general_lock_(general_lock());
+        synchro::lock_guard<Mutex> auto_general_lock_(*general_lock());
+        return *threadTransactionsStack_.find(id)->second;
+    }
+    inline static TransactionsStack &transactions_unsafe(thread_id_t id) {
+        //synchro::lock_guard<Mutex> auto_general_lock_(*general_lock());
         return *threadTransactionsStack_.find(id)->second;
     }
     private:
@@ -1851,7 +1848,11 @@
    public:
     inline TransactionsStack& transactions() {return transactionsRef_;}
     inline static TransactionsStack &transactions(thread_id_t id) {
-        light_auto_lock auto_general_lock_(general_lock());
+        synchro::lock_guard<Mutex> auto_general_lock_(*general_lock());
+        tss_context_map_type::iterator i = tss_context_map_.find(id);
+        return i->second->transactions_;
+    }
+    inline static TransactionsStack &transactions_unsafe(thread_id_t id) {
         tss_context_map_type::iterator i = tss_context_map_.find(id);
         return i->second->transactions_;
     }
@@ -2002,7 +2003,10 @@
    public:
     inline TransactionsStack& transactions() {return transactionsRef_;}
     inline static TransactionsStack &transactions(thread_id_t id) {
-        light_auto_lock auto_general_lock_(general_lock());
+        synchro::lock_guard<Mutex> auto_general_lock_(*general_lock());
+        return *threadTransactionsStack_.find(id)->second;
+    }
+    inline static TransactionsStack &transactions_unsafe(thread_id_t id) {
         return *threadTransactionsStack_.find(id)->second;
     }
     private:
@@ -2034,17 +2038,6 @@
 
 inline transaction* current_transaction() {return transaction::current_transaction();}
 
-template <typename MUTEX, MUTEX& mtx>
-locker<MUTEX,mtx>::locker() {
-    synchro::lock(mtx);
-}
-template <typename MUTEX, MUTEX& mtx>
-locker<MUTEX,mtx>::~locker() {}
-
-template <typename MUTEX, MUTEX& mtx>
-void locker<MUTEX,mtx>::unlock() {
-    synchro::unlock(mtx);
-}
 
 template <class T> T* cache_allocate(transaction* t) {
     #if defined(BOOST_STM_CACHE_USE_MEMORY_MANAGER) && defined (USE_STM_MEMORY_MANAGER)