Boost logo

Boost-Commit :

Subject: [Boost-commit] svn:boost r53499 - sandbox/stm/libs/stm/test
From: vicente.botet_at_[hidden]
Date: 2009-05-31 09:35:52


Author: viboes
Date: 2009-05-31 09:35:51 EDT (Sun, 31 May 2009)
New Revision: 53499
URL: http://svn.boost.org/trac/boost/changeset/53499

Log:
TBoost.Stm linkedlist implementation using as_new

Text files modified:
   sandbox/stm/libs/stm/test/testLinkedList.cpp | 15 +++
   sandbox/stm/libs/stm/test/testLinkedList.h | 157 ++++++++++++++++++++++++++++++++++++---
   2 files changed, 156 insertions(+), 16 deletions(-)

Modified: sandbox/stm/libs/stm/test/testLinkedList.cpp
==============================================================================
--- sandbox/stm/libs/stm/test/testLinkedList.cpp (original)
+++ sandbox/stm/libs/stm/test/testLinkedList.cpp 2009-05-31 09:35:51 EDT (Sun, 31 May 2009)
@@ -44,7 +44,9 @@
 ///////////////////////////////////////////////////////////////////////////////
 static void* TestLinkedListInserts(void *threadId)
 {
- list_node<list_node_type> node;
+#ifdef BOOST_STM_LL_USES_NODE
+ list_node<list_node_type> node;
+#endif
    transaction::initialize_thread();
 
    int start = *(int*)threadId;
@@ -65,8 +67,13 @@
    int i;
    for (i = startingValue; i < endingValue; ++i)
    {
+#ifdef BOOST_STM_LL_USES_NODE
+ //list_node<list_node_type> node(i);
       node.value() = i;
       llist->insert(node);
+#else
+ llist->insert(i);
+#endif
    }
 
    if (kDoMove)
@@ -78,6 +85,7 @@
          node1.value() = j;
          //node2.value() = -j;
          llist->move(node1, node2);
+
       }
 
    }
@@ -100,8 +108,13 @@
    {
       for (i = startingValue; i < endingValue; ++i)
       {
+ //list_node<list_node_type> node(i);
+#ifdef BOOST_STM_LL_USES_NODE
          node.value() = i;
          llist->remove(node);
+#else
+ llist->remove(i);
+#endif
       }
    }
 

Modified: sandbox/stm/libs/stm/test/testLinkedList.h
==============================================================================
--- sandbox/stm/libs/stm/test/testLinkedList.h (original)
+++ sandbox/stm/libs/stm/test/testLinkedList.h 2009-05-31 09:35:51 EDT (Sun, 31 May 2009)
@@ -1,10 +1,10 @@
 //////////////////////////////////////////////////////////////////////////////
 //
-// (C) Copyright Justin E. Gottchlich 2009.
-// (C) Copyright Vicente J. Botet Escriba 2009.
+// (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
+// 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/synchro for documentation.
@@ -26,8 +26,10 @@
 {
 public:
 
- list_node() : value_(0), next_(0) {}
- explicit list_node(int const &rhs) : value_(rhs), next_(NULL) {}
+ list_node() : value_(0), next_(0) {
+ }
+ explicit list_node(T const &rhs) : value_(rhs), next_(NULL) {
+ }
 
    // zero initialization for native types
    void clear() { value_ = T(); next_ = NULL; }
@@ -57,7 +59,7 @@
       return *this;
    }
 
- list_node(list_node &&rhs) : next_(rhs.next_), value_(boost::stm::draco_move(rhs.value_))
+ list_node(list_node &&rhs) : next_(rhs.next_), value_(boost::stm::draco_move(rhs.value_))
    { rhs.next_ = 0; }
 
    list_node& operator=(list_node&& rhs)
@@ -68,11 +70,10 @@
    }
 #endif
 
-
 private:
 
- list_node *next_;
    T value_;
+ list_node *next_;
 };
 
 ////////////////////////////////////////////////////////////////////////////
@@ -91,7 +92,7 @@
       bool succeeded1 = true, succeeded2 = true;
       transaction_state state = e_no_state;
 
- do
+ do
       {
          try
          {
@@ -102,7 +103,7 @@
          }
          catch (aborted_transaction_exception&) {}
 
- if (!succeeded1 || !succeeded2)
+ if (!succeeded1 || !succeeded2)
          {
             return false; // auto abort of t
          }
@@ -123,9 +124,26 @@
          catch (aborted_transaction_exception&) {}
       }
    }
+#ifdef BOOST_STM_USES_PARAM
+ bool insert(T val)
+#else
+ bool insert(const T& val)
+#endif
+ {
+ using namespace boost::stm;
 
+ for (transaction t; ;t.restart())
+ {
+ try { return internal_insert(val, t); }
+ catch (aborted_transaction_exception&) {}
+ }
+ }
    ////////////////////////////////////////////////////////////////////////////
+#ifdef BOOST_STM_USES_PARAM
+ bool lookup(T val)
+#else
    bool lookup(T const &val)
+#endif
    {
       using namespace boost::stm;
 
@@ -148,6 +166,21 @@
       }
    }
 
+#ifdef BOOST_STM_USES_PARAM
+ bool remove(T val)
+#else
+ bool remove(T const &val)
+#endif
+ {
+ using namespace boost::stm;
+
+ for (transaction t; ; t.restart())
+ {
+ try { return internal_remove(val, t); }
+ catch (aborted_transaction_exception&) {}
+ }
+ }
+
    ////////////////////////////////////////////////////////////////////////////
    void outputList(std::ofstream &o)
    {
@@ -215,7 +248,7 @@
          list_node<T> const *cur = t.read_ptr(headP->next());
          T val = rhs.value();
 
- while (true)
+ while (true)
          {
             if (cur->value() == val) return false;
             else if (cur->value() > val || !cur->next()) break;
@@ -255,14 +288,81 @@
       return true;
    }
 
+#ifdef BOOST_STM_USES_PARAM
+ bool internal_insert(T val, boost::stm::transaction &t)
+#else
+ bool internal_insert(const T& val, boost::stm::transaction &t)
+#endif
+ {
+ //T val = valr;
+ list_node<T> const *headP = &t.read(head_);
+
+ if (NULL != headP->next())
+ {
+ list_node<T> const *prev = headP;
+ list_node<T> const *cur = t.read_ptr(headP->next());
+
+ while (true)
+ {
+ if (cur->value() == val) return false;
+ else if (cur->value() > val || !cur->next()) break;
+
+ prev = cur;
+
+ list_node<T> const *curNext = t.read_ptr(cur->next());
+
+ if (NULL == curNext) break;
+
+ cur = curNext;
+ }
+#ifndef BOOST_STM_USES_AS_NEW
+ list_node<T> node(val);
+ list_node<T> *newNode = t.new_memory_copy(node);
+#else
+ t.throw_if_forced_to_abort_on_new();
+ list_node<T> *newNode = t.as_new(new list_node<T>(val));
+#endif
+ //--------------------------------------------------------------------
+ // if cur->next() is null it means our newNode value is greater than
+ // cur, so insert ourselves after cur.
+ //--------------------------------------------------------------------
+ if (val > cur->value()) t.write_ptr((list_node<T>*)cur)->next_for_new_mem(newNode, t);
+ //--------------------------------------------------------------------
+ // otherwise, we are smaller than cur, so insert between prev and cur
+ //--------------------------------------------------------------------
+ else
+ {
+ newNode->next(cur, t);
+ t.write_ptr((list_node<T>*)prev)->next_for_new_mem(newNode, t);
+ }
+ }
+ else
+ {
+#ifndef BOOST_STM_USES_AS_NEW
+ list_node<T> node(val);
+ list_node<T> *newNode = t.new_memory_copy(node);
+#else
+ t.throw_if_forced_to_abort_on_new();
+ list_node<T> *newNode = t.as_new(new list_node<T>(val));
+#endif
+ t.write(head_).next_for_new_mem(newNode, t);
+ }
+
+ t.end();
+ return true;
+ }
    //--------------------------------------------------------------------------
    // find the location to insert the node. if the value already exists, bail
    //--------------------------------------------------------------------------
+#ifdef BOOST_STM_USES_PARAM
+ bool internal_lookup(T val, boost::stm::transaction &t)
+#else
    bool internal_lookup(T const &val, boost::stm::transaction &t)
+#endif
    {
       list_node<T> const *cur = &t.read(head_);
 
- for (; true ; cur = t.read(*cur).next() )
+ for (; true ; cur = t.read(*cur).next() )
       {
          list_node<T> const *trueCur = &t.read(*cur);
 
@@ -303,6 +403,33 @@
       return false;
    }
 
+#ifdef BOOST_STM_USES_PARAM
+ bool internal_remove(T value, boost::stm::transaction &t)
+#else
+ bool internal_remove(T const &value, boost::stm::transaction &t)
+#endif
+ {
+ list_node<T> const *prev = &t.read(head_);
+
+ for (list_node<T> const *cur = prev; cur != NULL; prev = cur)
+ {
+ cur = t.read(*cur).next();
+
+ if (NULL == cur) break;
+
+ if (cur->value() == value)
+ {
+ list_node<T> const *curNext = t.read(*cur).next();
+
+ t.delete_memory(*cur);
+ t.write(*(list_node<T>*)prev).next(curNext, t);
+ t.end();
+ return true;
+ }
+ }
+
+ return false;
+ }
    //--------------------------------------------------------------------------
    // find the location to insert the node. if the value already exists, bail
    //--------------------------------------------------------------------------
@@ -319,7 +446,7 @@
          list_node<T> const *cur = t.read_ptr(headP->next());
          T val = rhs.value();
 
- while (true)
+ while (true)
          {
             if (cur->value() == val) return false;
             else if (cur->value() > val || !cur->next()) break;
@@ -367,7 +494,7 @@
 
       list_node<T> const *prev = &t.read(head_);
 
- for (list_node<T> const *cur = prev; cur != NULL;
+ for (list_node<T> const *cur = prev; cur != NULL;
            prev = cur, cur = t.read(*cur).next())
       {
          if (cur->value() == rhs.value())


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