Boost logo

Boost-Commit :

From: pdimov_at_[hidden]
Date: 2008-07-12 06:41:24


Author: pdimov
Date: 2008-07-12 06:41:24 EDT (Sat, 12 Jul 2008)
New Revision: 47341
URL: http://svn.boost.org/trac/boost/changeset/47341

Log:
Merged 44595, 44638, 44707, 44711, 44728 from trunk to release
Added:
   branches/release/boost/detail/lightweight_thread.hpp
      - copied unchanged from r44638, /trunk/boost/detail/lightweight_thread.hpp
Text files modified:
   branches/release/boost/detail/shared_count.hpp | 27 +++++--
   branches/release/boost/detail/yield_k.hpp | 6 +
   branches/release/boost/shared_ptr.hpp | 8 +
   branches/release/libs/smart_ptr/test/shared_ptr_mt_test.cpp | 139 ++++++---------------------------------
   branches/release/libs/smart_ptr/test/weak_ptr_mt_test.cpp | 132 +++++--------------------------------
   5 files changed, 74 insertions(+), 238 deletions(-)

Modified: branches/release/boost/detail/shared_count.hpp
==============================================================================
--- branches/release/boost/detail/shared_count.hpp (original)
+++ branches/release/boost/detail/shared_count.hpp 2008-07-12 06:41:24 EDT (Sat, 12 Jul 2008)
@@ -28,8 +28,11 @@
 #include <boost/detail/bad_weak_ptr.hpp>
 #include <boost/detail/sp_counted_base.hpp>
 #include <boost/detail/sp_counted_impl.hpp>
-
-#include <memory> // std::auto_ptr
+// In order to avoid circular dependencies with Boost.TR1
+// we make sure that our include of <memory> doesn't try to
+// pull in the TR1 headers: that's why we use this header
+// rather than including <memory> directly:
+#include <boost/config/no_tr1/memory.hpp> // std::auto_ptr
 #include <functional> // std::less
 #include <new> // std::bad_alloc
 
@@ -321,9 +324,13 @@
     weak_count & operator= (shared_count const & r) // nothrow
     {
         sp_counted_base * tmp = r.pi_;
- if(tmp != 0) tmp->weak_add_ref();
- if(pi_ != 0) pi_->weak_release();
- pi_ = tmp;
+
+ if( tmp != pi_ )
+ {
+ if(tmp != 0) tmp->weak_add_ref();
+ if(pi_ != 0) pi_->weak_release();
+ pi_ = tmp;
+ }
 
         return *this;
     }
@@ -331,9 +338,13 @@
     weak_count & operator= (weak_count const & r) // nothrow
     {
         sp_counted_base * tmp = r.pi_;
- if(tmp != 0) tmp->weak_add_ref();
- if(pi_ != 0) pi_->weak_release();
- pi_ = tmp;
+
+ if( tmp != pi_ )
+ {
+ if(tmp != 0) tmp->weak_add_ref();
+ if(pi_ != 0) pi_->weak_release();
+ pi_ = tmp;
+ }
 
         return *this;
     }

Modified: branches/release/boost/detail/yield_k.hpp
==============================================================================
--- branches/release/boost/detail/yield_k.hpp (original)
+++ branches/release/boost/detail/yield_k.hpp 2008-07-12 06:41:24 EDT (Sat, 12 Jul 2008)
@@ -111,7 +111,11 @@
     }
     else
     {
- struct timespec rqtp = { 0 };
+ // g++ -Wextra warns on {} or {0}
+ struct timespec rqtp = { 0, 0 };
+
+ // POSIX says that timespec has tv_sec and tv_nsec
+ // But it doesn't guarantee order or placement
 
         rqtp.tv_sec = 0;
         rqtp.tv_nsec = 1000;

Modified: branches/release/boost/shared_ptr.hpp
==============================================================================
--- branches/release/boost/shared_ptr.hpp (original)
+++ branches/release/boost/shared_ptr.hpp 2008-07-12 06:41:24 EDT (Sat, 12 Jul 2008)
@@ -20,7 +20,11 @@
 #include <boost/detail/shared_ptr_nmt.hpp>
 #else
 
-#include <memory> // for std::auto_ptr
+// In order to avoid circular dependencies with Boost.TR1
+// we make sure that our include of <memory> doesn't try to
+// pull in the TR1 headers: that's why we use this header
+// rather than including <memory> directly:
+#include <boost/config/no_tr1/memory.hpp> // std::auto_ptr
 
 #include <boost/assert.hpp>
 #include <boost/checked_delete.hpp>
@@ -573,7 +577,7 @@
 
 #if !defined(BOOST_NO_IOSTREAM)
 
-#if defined(__GNUC__) && (__GNUC__ < 3)
+#if defined(BOOST_NO_TEMPLATED_IOSTREAMS) || ( defined(__GNUC__) && (__GNUC__ < 3) )
 
 template<class Y> std::ostream & operator<< (std::ostream & os, shared_ptr<Y> const & p)
 {

Modified: branches/release/libs/smart_ptr/test/shared_ptr_mt_test.cpp
==============================================================================
--- branches/release/libs/smart_ptr/test/shared_ptr_mt_test.cpp (original)
+++ branches/release/libs/smart_ptr/test/shared_ptr_mt_test.cpp 2008-07-12 06:41:24 EDT (Sat, 12 Jul 2008)
@@ -7,167 +7,76 @@
 #pragma warning(disable: 4514) // unreferenced inline removed
 #endif
 
-//
 // shared_ptr_mt_test.cpp - tests shared_ptr with multiple threads
 //
 // Copyright (c) 2002 Peter Dimov and Multi Media Ltd.
+// Copyright (c) 2008 Peter Dimov
 //
-// 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)
-//
+// 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
 
 #include <boost/shared_ptr.hpp>
 #include <boost/bind.hpp>
 
 #include <vector>
-#include <memory>
-#include <stdexcept>
 
 #include <cstdio>
 #include <ctime>
 
-// 'portable' thread framework
-
-class abstract_thread
-{
-public:
-
- virtual ~abstract_thread() {}
- virtual void run() = 0;
-};
-
-#if !defined(BOOST_HAS_PTHREADS) && defined(BOOST_HAS_WINTHREADS)
-
-char const * title = "Using Windows threads";
-
-#include <windows.h>
-#include <process.h>
+#include <boost/detail/lightweight_thread.hpp>
 
-typedef HANDLE pthread_t;
+//
 
-unsigned __stdcall common_thread_routine(void * pv)
-{
- abstract_thread * pt = static_cast<abstract_thread *>(pv);
- pt->run();
- delete pt;
- return 0;
-}
+int const n = 1024 * 1024;
 
-int pthread_create(pthread_t * thread, void const *, unsigned (__stdcall * start_routine) (void*), void* arg)
+void test( boost::shared_ptr<int> const & pi )
 {
- HANDLE h = (HANDLE)_beginthreadex(0, 0, start_routine, arg, 0, 0);
+ std::vector< boost::shared_ptr<int> > v;
 
- if(h != 0)
+ for( int i = 0; i < n; ++i )
     {
- *thread = h;
- return 0;
- }
- else
- {
- return 1; // return errno;
+ v.push_back( pi );
     }
 }
 
-int pthread_join(pthread_t thread, void ** /*value_ptr*/)
-{
- ::WaitForSingleObject(thread, INFINITE);
- ::CloseHandle(thread);
- return 0;
-}
+int const m = 16; // threads
 
-#else
+#if defined( BOOST_HAS_PTHREADS )
 
-char const * title = "Using POSIX threads";
+char const * thmodel = "POSIX";
 
-#include <pthread.h>
+#else
 
-extern "C" void * common_thread_routine(void * pv)
-{
- abstract_thread * pt = static_cast<abstract_thread *>(pv);
- pt->run();
- delete pt;
- return 0;
-}
+char const * thmodel = "Windows";
 
 #endif
 
-//
-
-template<class F> class thread: public abstract_thread
-{
-public:
-
- explicit thread(F f): f_(f)
- {
- }
-
- void run()
- {
- f_();
- }
-
-private:
-
- F f_;
-};
-
-template<class F> pthread_t createThread(F f)
-{
- std::auto_ptr<abstract_thread> p(new thread<F>(f));
-
- pthread_t r;
-
- if(pthread_create(&r, 0, common_thread_routine, p.get()) == 0)
- {
- p.release();
- return r;
- }
-
- throw std::runtime_error("createThread failed.");
-}
-
-//
-
-int const n = 1024 * 1024;
-
-void test(boost::shared_ptr<int> const & pi)
-{
- std::vector< boost::shared_ptr<int> > v;
-
- for(int i = 0; i < n; ++i)
- {
- v.push_back(pi);
- }
-}
-
-int const m = 16; // threads
-
 int main()
 {
     using namespace std; // printf, clock_t, clock
 
- printf("%s: %d threads, %d iterations: ", title, m, n);
+ printf( "Using %s threads: %d threads, %d iterations: ", thmodel, m, n );
 
- boost::shared_ptr<int> pi(new int(42));
+ boost::shared_ptr<int> pi( new int(42) );
 
     clock_t t = clock();
 
- pthread_t a[m];
+ pthread_t a[ m ];
 
- for(int i = 0; i < m; ++i)
+ for( int i = 0; i < m; ++i )
     {
- a[i] = createThread( boost::bind(test, pi) );
+ boost::detail::lw_thread_create( a[ i ], boost::bind( test, pi ) );
     }
 
- for(int j = 0; j < m; ++j)
+ for( int j = 0; j < m; ++j )
     {
- pthread_join(a[j], 0);
+ pthread_join( a[j], 0 );
     }
 
     t = clock() - t;
 
- printf("\n\n%.3f seconds.\n", static_cast<double>(t) / CLOCKS_PER_SEC);
+ printf( "\n\n%.3f seconds.\n", static_cast<double>(t) / CLOCKS_PER_SEC );
 
     return 0;
 }

Modified: branches/release/libs/smart_ptr/test/weak_ptr_mt_test.cpp
==============================================================================
--- branches/release/libs/smart_ptr/test/weak_ptr_mt_test.cpp (original)
+++ branches/release/libs/smart_ptr/test/weak_ptr_mt_test.cpp 2008-07-12 06:41:24 EDT (Sat, 12 Jul 2008)
@@ -7,128 +7,26 @@
 #pragma warning(disable: 4514) // unreferenced inline removed
 #endif
 
-//
 // weak_ptr_mt_test.cpp
 //
 // Copyright (c) 2002 Peter Dimov and Multi Media Ltd.
-// Copyright 2005 Peter Dimov
-//
-// 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)
+// Copyright 2005, 2008 Peter Dimov
 //
+// 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
 
 #include <boost/shared_ptr.hpp>
 #include <boost/weak_ptr.hpp>
 #include <boost/bind.hpp>
 
 #include <vector>
-#include <memory>
-#include <stdexcept>
 
 #include <cstdio>
 #include <ctime>
 #include <cstdlib>
 
-// 'portable' thread framework
-
-class abstract_thread
-{
-public:
-
- virtual ~abstract_thread() {}
- virtual void run() = 0;
-};
-
-#if !defined(BOOST_HAS_PTHREADS) && defined(BOOST_HAS_WINTHREADS)
-
-char const * title = "Using Windows threads";
-
-#include <windows.h>
-#include <process.h>
-
-typedef HANDLE pthread_t;
-
-unsigned __stdcall common_thread_routine(void * pv)
-{
- abstract_thread * pt = static_cast<abstract_thread *>(pv);
- pt->run();
- delete pt;
- return 0;
-}
-
-int pthread_create(pthread_t * thread, void const *, unsigned (__stdcall * start_routine) (void*), void* arg)
-{
- HANDLE h = (HANDLE)_beginthreadex(0, 0, start_routine, arg, 0, 0);
-
- if(h != 0)
- {
- *thread = h;
- return 0;
- }
- else
- {
- return 1; // return errno;
- }
-}
-
-int pthread_join(pthread_t thread, void ** /*value_ptr*/)
-{
- ::WaitForSingleObject(thread, INFINITE);
- ::CloseHandle(thread);
- return 0;
-}
-
-#else
-
-char const * title = "Using POSIX threads";
-
-#include <pthread.h>
-
-extern "C" void * common_thread_routine(void * pv)
-{
- abstract_thread * pt = static_cast<abstract_thread *>(pv);
- pt->run();
- delete pt;
- return 0;
-}
-
-#endif
-
-//
-
-template<class F> class thread: public abstract_thread
-{
-public:
-
- explicit thread(F f): f_(f)
- {
- }
-
- void run()
- {
- f_();
- }
-
-private:
-
- F f_;
-};
-
-template<class F> pthread_t createThread(F f)
-{
- std::auto_ptr<abstract_thread> p(new thread<F>(f));
-
- pthread_t r;
-
- if(pthread_create(&r, 0, common_thread_routine, p.get()) == 0)
- {
- p.release();
- return r;
- }
-
- throw std::runtime_error("createThread failed.");
-}
+#include <boost/detail/lightweight_thread.hpp>
 
 //
 
@@ -177,11 +75,21 @@
     printf( "\n%d locks, %d forced rebinds, %d normal rebinds.", s, f, r );
 }
 
+#if defined( BOOST_HAS_PTHREADS )
+
+char const * thmodel = "POSIX";
+
+#else
+
+char const * thmodel = "Windows";
+
+#endif
+
 int main()
 {
     using namespace std; // printf, clock_t, clock
 
- printf("%s: %d threads, %d * %d iterations: ", title, m, n, k );
+ printf("Using %s threads: %d threads, %d * %d iterations: ", thmodel, m, n, k );
 
     std::vector< boost::shared_ptr<int> > v( k );
 
@@ -192,16 +100,16 @@
 
     clock_t t = clock();
 
- pthread_t a[m];
+ pthread_t a[ m ];
 
- for(int i = 0; i < m; ++i)
+ for( int i = 0; i < m; ++i )
     {
- a[i] = createThread( boost::bind( test, v ) );
+ boost::detail::lw_thread_create( a[ i ], boost::bind( test, v ) );
     }
 
     v.resize( 0 ); // kill original copies
 
- for(int j = 0; j < m; ++j)
+ for( int j = 0; j < m; ++j )
     {
         pthread_join( a[j], 0 );
     }


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