re PR libstdc++/65393 (std::thread shared_ptr inefficiency)
authorJonathan Wakely <jwakely@redhat.com>
Tue, 16 Jun 2015 17:53:52 +0000 (18:53 +0100)
committerJonathan Wakely <redi@gcc.gnu.org>
Tue, 16 Jun 2015 17:53:52 +0000 (18:53 +0100)
PR libstdc++/65393
* src/c++11/thread.cc (thread::_M_make_thread): Replace shared_ptr
copies with moves.

From-SVN: r224530

libstdc++-v3/ChangeLog
libstdc++-v3/src/c++11/thread.cc

index e124e06be7f71f8a10dcc429d2988edcf4f23444..8c9ed9a45b98aae55498d14b74ae7c7f1f2cffd4 100644 (file)
@@ -1,3 +1,9 @@
+2015-06-16  Jonathan Wakely  <jwakely@redhat.com>
+
+       PR libstdc++/65393
+       * src/c++11/thread.cc (thread::_M_make_thread): Replace shared_ptr
+       copies with moves.
+
 2015-06-12  Jonathan Wakely  <jwakely@redhat.com>
 
        * include/precompiled/stdc++.h: Include <codecvt> and <shared_mutex>.
index 954f2676aa16c5de346946e6fdcb63b9f2341472..906cafa735a729cc1464eb81e4867acb8bb63109 100644 (file)
@@ -92,7 +92,7 @@ namespace std _GLIBCXX_VISIBILITY(default)
          std::terminate();
        }
 
-      return 0;
+      return nullptr;
     }
   }
 
@@ -137,18 +137,19 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
       __throw_system_error(int(errc::operation_not_permitted));
 #endif
 
-    _M_start_thread(__b, nullptr);
+    _M_start_thread(std::move(__b), nullptr);
   }
 
   void
   thread::_M_start_thread(__shared_base_type __b, void (*)())
   {
-    __b->_M_this_ptr = __b;
+    auto ptr = __b.get();
+    ptr->_M_this_ptr = std::move(__b);
     int __e = __gthread_create(&_M_id._M_thread,
-                              &execute_native_thread_routine, __b.get());
+                              &execute_native_thread_routine, ptr);
     if (__e)
     {
-      __b->_M_this_ptr.reset();
+      ptr->_M_this_ptr.reset();
       __throw_system_error(__e);
     }
   }