re PR libstdc++/61841 (broken std::thread on Hurd)
authorJonathan Wakely <jwakely@redhat.com>
Wed, 13 Aug 2014 18:40:10 +0000 (19:40 +0100)
committerJonathan Wakely <redi@gcc.gnu.org>
Wed, 13 Aug 2014 18:40:10 +0000 (19:40 +0100)
PR libstdc++/61841
* include/std/thread (thread::_M_start_thread): Declare new overload.
(thread::thread<_Callable, _Args...>): Call new overload with an
explicit reference to pthread_create.
* src/c++11/thread.cc (thread::_M_start_thread): Add new overload.
* config/abi/pre/gnu.ver: Export new function.

From-SVN: r213922

libstdc++-v3/ChangeLog
libstdc++-v3/config/abi/pre/gnu.ver
libstdc++-v3/include/std/thread
libstdc++-v3/src/c++11/thread.cc

index 3b15d2d9263ef488035d052a5523846f6add4f87..208c778b7aa03810eb676d18e36a099f400db070 100644 (file)
@@ -1,3 +1,12 @@
+2014-08-13  Jonathan Wakely  <jwakely@redhat.com>
+
+       PR libstdc++/61841
+       * include/std/thread (thread::_M_start_thread): Declare new overload.
+       (thread::thread<_Callable, _Args...>): Call new overload with an
+       explicit reference to pthread_create.
+       * src/c++11/thread.cc (thread::_M_start_thread): Add new overload.
+       * config/abi/pre/gnu.ver: Export new function.
+
 2014-08-13  Sylvestre Ledru  <sylvestre@debian.org>
 
        * include/profile/impl/profiler_hash_func.h: Fix a comment typo
index ed7a93f646d8c52034a14a6db43af2c079683dd6..41fac71adaf95652b6c068dbd4e6d2b00776f121 100644 (file)
@@ -1372,6 +1372,9 @@ GLIBCXX_3.4.21 {
     # std::regex_error::regex_error(std::regex_constants::error_type)
     _ZNSt11regex_errorC2ENSt15regex_constants10error_typeE;
 
+    # void std::thread::_M_start_thread(__shared_base_type, void(*)())
+    _ZNSt6thread15_M_start_threadESt10shared_ptrINS_10_Impl_baseEEPFvvE;
+
 } GLIBCXX_3.4.20;
 
 
index efcb1018a8bae87bd30b696d7165948939c07689..057634722eedd3dfea052057eab598f9d60b5c32 100644 (file)
@@ -132,9 +132,17 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
       explicit 
       thread(_Callable&& __f, _Args&&... __args)
       {
+#ifdef GTHR_ACTIVE_PROXY
+       // Create a reference to pthread_create, not just the gthr weak symbol
+        _M_start_thread(_M_make_routine(std::__bind_simple(
+                std::forward<_Callable>(__f),
+                std::forward<_Args>(__args)...)),
+           reinterpret_cast<void(*)()>(&pthread_create));
+#else
         _M_start_thread(_M_make_routine(std::__bind_simple(
                 std::forward<_Callable>(__f),
                 std::forward<_Args>(__args)...)));
+#endif
       }
 
     ~thread()
@@ -182,6 +190,9 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
     hardware_concurrency() noexcept;
 
   private:
+    void
+    _M_start_thread(__shared_base_type, void (*)());
+
     void
     _M_start_thread(__shared_base_type);
 
index 49aacb5a96da34f58d5c9c2b5a499c7435bdf4c5..bbcc99c56b89fe9bfe4b1bd2774721f224e58513 100644 (file)
@@ -137,6 +137,12 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
       __throw_system_error(int(errc::operation_not_permitted));
 #endif
 
+    _M_start_thread(__b, nullptr);
+  }
+
+  void
+  thread::_M_start_thread(__shared_base_type __b, void (*)())
+  {
     __b->_M_this_ptr = __b;
     int __e = __gthread_create(&_M_id._M_thread,
                               &execute_native_thread_routine, __b.get());