thread (_Impl_base): Move _M_id out and into ...
authorChris Fairles <cfairles@gcc.gnu.org>
Fri, 13 Feb 2009 23:08:50 +0000 (23:08 +0000)
committerBenjamin Kosnik <bkoz@gcc.gnu.org>
Fri, 13 Feb 2009 23:08:50 +0000 (23:08 +0000)
2009-02-13  Chris Fairles  <cfairles@gcc.gnu.org>
    Benjamin Kosnik  <bkoz@redhat.com>

* include/std/thread (_Impl_base): Move _M_id out and into ...
(thread): ...here. Call _M_make_routine in body of constructors.
Adjust data member usage to reflect changes.
(_M_make_routine): From _M_make_shared_data.
(_M_start_thread): Add __shared_base_type argument.
* src/thread.cc: Fixups for above.
* config/abi/pre/gnu.ver: Adjust exports.
* testsuite/30_threads/thread/native_handle/typesizes.cc: Enable.
* testsuite/30_threads/thread/cons/assign_neg.cc: Adjust line numbers.
* testsuite/30_threads/thread/cons/copy_neg.cc: Same.

Co-Authored-By: Benjamin Kosnik <bkoz@redhat.com>
From-SVN: r144171

libstdc++-v3/ChangeLog
libstdc++-v3/config/abi/pre/gnu.ver
libstdc++-v3/include/std/thread
libstdc++-v3/src/thread.cc
libstdc++-v3/testsuite/30_threads/thread/cons/assign_neg.cc
libstdc++-v3/testsuite/30_threads/thread/cons/copy_neg.cc
libstdc++-v3/testsuite/30_threads/thread/native_handle/typesizes.cc

index c60b452..c8d9d41 100644 (file)
@@ -1,3 +1,17 @@
+2009-02-13  Chris Fairles  <cfairles@gcc.gnu.org>
+           Benjamin Kosnik  <bkoz@redhat.com>
+
+       * include/std/thread (_Impl_base): Move _M_id out and into ...
+       (thread): ...here. Call _M_make_routine in body of constructors.
+       Adjust data member usage to reflect changes.
+       (_M_make_routine): From _M_make_shared_data.
+       (_M_start_thread): Add __shared_base_type argument.
+       * src/thread.cc: Fixups for above.
+       * config/abi/pre/gnu.ver: Adjust exports.
+       * testsuite/30_threads/thread/native_handle/typesizes.cc: Enable.
+       * testsuite/30_threads/thread/cons/assign_neg.cc: Adjust line numbers.
+       * testsuite/30_threads/thread/cons/copy_neg.cc: Same.
+
 2009-02-12  Benjamin Kosnik  <bkoz@redhat.com>
 
        * testsuite/util/thread/all.h (compare_type_to_native_type_sizes): To...
index 1754f07..f5e6d2f 100644 (file)
@@ -897,9 +897,9 @@ GLIBCXX_3.4.11 {
     _ZNSt22condition_variable_anyD2Ev;
 
     # thread
-    _ZNSt6thread15_M_start_threadEv;
     _ZNSt6thread4joinEv;
     _ZNSt6thread6detachEv;
+    _ZNSt6thread15_M_start_threadESt10shared_ptrINS_10_Impl_baseEE;
 
     # system_error
     _ZSt15system_category;
index b527d59..8cd0e3a 100644 (file)
@@ -57,14 +57,14 @@ namespace std
   class thread
   {
   public:
-    typedef __gthread_t                        native_handle_type;
+    typedef __gthread_t                        native_handle_type;
     struct _Impl_base;
     typedef shared_ptr<_Impl_base>     __shared_base_type;
 
     /// thread::id
     class id
     {
-      native_handle_type       _M_thread;
+      native_handle_type       _M_thread;
 
     public:
       id() : _M_thread() { }
@@ -88,35 +88,31 @@ namespace std
        operator<<(basic_ostream<_CharT, _Traits>&& __out, thread::id __id);
     };
 
+    // Simple base type that the templatized, derived class containing
+    // an abitrary functor can be converted to and called.
     struct _Impl_base
     {
-      id                       _M_id;
-       __shared_base_type      _M_this_ptr;
-
-      _Impl_base() = default;
+      __shared_base_type       _M_this_ptr;
 
       virtual ~_Impl_base() = default;
 
-      virtual void 
-      _M_run() = 0;
+      virtual void _M_run() = 0;
     };
 
     template<typename _Callable>
-      class _Impl : public _Impl_base
+      struct _Impl : public _Impl_base
       {
-       _Callable               _M_func;
+       _Callable               _M_func;
 
-      public:
        _Impl(_Callable&& __f) : _M_func(std::forward<_Callable>(__f))
        { }
 
-       void 
+       void
        _M_run() { _M_func(); }
       };
 
   private:
-    // NB: Store the base type here.
-    __shared_base_type                 _M_data;
+    id                         _M_id;
 
   public:
     thread() = default;
@@ -127,13 +123,11 @@ namespace std
 
     template<typename _Callable>
       explicit thread(_Callable __f)
-      : _M_data(_M_make_shared_data<_Callable>(__f))
-      { _M_start_thread(); }
+      { _M_start_thread(_M_make_routine<_Callable>(__f)); }
 
     template<typename _Callable, typename... _Args>
       thread(_Callable&& __f, _Args&&... __args)
-      : _M_data(_M_make_shared_data(std::bind(__f, __args...)))
-      { _M_start_thread(); }
+      { _M_start_thread(_M_make_routine(std::bind(__f, __args...))); }
 
     ~thread()
     {
@@ -153,11 +147,11 @@ namespace std
 
     void
     swap(thread&& __t)
-    { std::swap(_M_data, __t._M_data); }
+    { std::swap(_M_id, __t._M_id); }
 
     bool
     joinable() const
-    { return _M_data; }
+    { return !(_M_id == id()); }
 
     void
     join();
@@ -167,18 +161,13 @@ namespace std
 
     thread::id
     get_id() const
-    {
-      if (_M_data)
-       return thread::id(_M_data->_M_id._M_thread);
-      else
-       return thread::id();
-    }
+    { return _M_id; }
 
     /** @pre thread is joinable
      */
     native_handle_type
     native_handle()
-    { return _M_data->_M_id._M_thread; }
+    { return _M_id._M_thread; }
 
     // Returns a value that hints at the number of hardware thread contexts.
     static unsigned int
@@ -186,15 +175,16 @@ namespace std
     { return 0; }
 
   private:
+    void
+    _M_start_thread(__shared_base_type);
+
     template<typename _Callable>
       shared_ptr<_Impl<_Callable>>
-      _M_make_shared_data(_Callable&& __f)
+      _M_make_routine(_Callable&& __f)
       {
        // Create and allocate full data structure, not base.
        return make_shared<_Impl<_Callable>>(std::forward<_Callable>(__f));
       }
-
-    void _M_start_thread();
   };
 
   inline void
index 2c3b5dc..ad39925 100644 (file)
@@ -61,16 +61,16 @@ namespace std
   {
     int __e = EINVAL;
 
-    if (_M_data)
+    if (_M_id != id())
     {
       void* __r = 0;
-      __e = __gthread_join(_M_data->_M_id._M_thread, &__r);
+      __e = __gthread_join(_M_id._M_thread, &__r);
     }
 
     if (__e)
       __throw_system_error(__e);
 
-    _M_data.reset();
+    _M_id = id();
   }
 
   void
@@ -78,24 +78,24 @@ namespace std
   {
     int __e = EINVAL;
 
-    if (_M_data)
-      __e = __gthread_detach(_M_data->_M_id._M_thread);
+    if (_M_id != id())
+      __e = __gthread_detach(_M_id._M_thread);
 
     if (__e)
       __throw_system_error(__e);
 
-    _M_data.reset();
+    _M_id = id();
   }
 
   void
-  thread::_M_start_thread()
+  thread::_M_start_thread(__shared_base_type __b)
   {
-    _M_data->_M_this_ptr = _M_data;
-    int __e = __gthread_create(&_M_data->_M_id._M_thread,
-                              &execute_native_thread_routine, _M_data.get());
+    __b->_M_this_ptr = __b;
+    int __e = __gthread_create(&_M_id._M_thread,
+                              &execute_native_thread_routine, __b.get());
     if (__e)
     {
-      _M_data->_M_this_ptr.reset();
+      __b->_M_this_ptr.reset();
       __throw_system_error(__e);
     }
   }
index 527c29c..12a2d55 100644 (file)
@@ -33,4 +33,4 @@ void test01()
 }
 
 // { dg-error "used here" "" { target *-*-* } 32 }
-// { dg-error "deleted function" "" { target *-*-* } 144 }
+// { dg-error "deleted function" "" { target *-*-* } 138 }
index 15ec77e..d94b92b 100644 (file)
@@ -32,5 +32,5 @@ void test01()
 }
 
 // { dg-error "here" "" { target *-*-* } 31 }
-// { dg-error "deleted function" "" { target *-*-* } 123 }
+// { dg-error "deleted function" "" { target *-*-* } 119 }
 // { dg-excess-errors "In file included from" }
index 2af81fb..6f3f650 100644 (file)
@@ -29,7 +29,6 @@
 int main()
 {
   typedef std::thread test_type;
-  // XX disable for now
-  //__gnu_test::compare_type_to_native_type<test_type>();
+  __gnu_test::compare_type_to_native_type<test_type>();
   return 0;
 }