Add portable timed_mutex and recursive_timed_mutex.
authorJonathan Wakely <jwakely@redhat.com>
Fri, 4 Sep 2015 11:23:44 +0000 (12:23 +0100)
committerJonathan Wakely <redi@gcc.gnu.org>
Fri, 4 Sep 2015 11:23:44 +0000 (12:23 +0100)
PR libstdc++/65704
* include/Makefile.am: Add <bits/mutex.h>.
* include/Makefile.in: Regenerate.
* include/bits/mutex.h (__mutex_base, mutex, lock_guard, unique_lock):
New file containing types moved from <mutex>.
* include/std/condition_variable: Include <bits/mutex.h> instead of
<mutex>.
* include/std/mutex (__mutex_base, mutex, lock_guard, unique_lock):
Move to <bits/mutex.h>.
*  testsuite/30_threads/recursive_timed_mutex/cons/1.cc: Remove
dg-require-gthreads-timed.
*  testsuite/30_threads/recursive_timed_mutex/cons/assign_neg.cc:
Likewise.
*  testsuite/30_threads/recursive_timed_mutex/cons/copy_neg.cc:
Likewise.
*  testsuite/30_threads/recursive_timed_mutex/dest/
destructor_locked.cc: Likewise.
*  testsuite/30_threads/recursive_timed_mutex/lock/1.cc: Likewise.
*  testsuite/30_threads/recursive_timed_mutex/lock/2.cc: Likewise.
*  testsuite/30_threads/recursive_timed_mutex/try_lock/1.cc: Likewise.
*  testsuite/30_threads/recursive_timed_mutex/try_lock/2.cc: Likewise.
*  testsuite/30_threads/recursive_timed_mutex/try_lock_for/1.cc:
Likewise.
*  testsuite/30_threads/recursive_timed_mutex/try_lock_for/2.cc:
Likewise.
*  testsuite/30_threads/recursive_timed_mutex/try_lock_for/3.cc:
Likewise.
*  testsuite/30_threads/recursive_timed_mutex/try_lock_until/1.cc:
Likewise.
*  testsuite/30_threads/recursive_timed_mutex/try_lock_until/2.cc:
Likewise.
*  testsuite/30_threads/recursive_timed_mutex/unlock/1.cc: Likewise.
*  testsuite/30_threads/timed_mutex/cons/1.cc: Likewise.
*  testsuite/30_threads/timed_mutex/cons/assign_neg.cc: Likewise.
*  testsuite/30_threads/timed_mutex/cons/copy_neg.cc: Likewise.
*  testsuite/30_threads/timed_mutex/dest/destructor_locked.cc:
Likewise.
*  testsuite/30_threads/timed_mutex/lock/1.cc: Likewise.
*  testsuite/30_threads/timed_mutex/requirements/standard_layout.cc:
Likewise.
*  testsuite/30_threads/timed_mutex/try_lock/1.cc: Likewise.
*  testsuite/30_threads/timed_mutex/try_lock/2.cc: Likewise.
*  testsuite/30_threads/timed_mutex/try_lock_for/1.cc: Likewise.
*  testsuite/30_threads/timed_mutex/try_lock_for/2.cc: Likewise.
*  testsuite/30_threads/timed_mutex/try_lock_for/3.cc: Likewise.
*  testsuite/30_threads/timed_mutex/try_lock_until/1.cc: Likewise.
*  testsuite/30_threads/timed_mutex/try_lock_until/2.cc: Likewise.
*  testsuite/30_threads/timed_mutex/try_lock_until/57641.cc: Likewise.
*  testsuite/30_threads/timed_mutex/unlock/1.cc: Likewise.
*  testsuite/30_threads/unique_lock/cons/5.cc: Likewise.
*  testsuite/30_threads/unique_lock/cons/6.cc: Likewise.
*  testsuite/30_threads/unique_lock/locking/3.cc: Likewise.
*  testsuite/30_threads/unique_lock/locking/4.cc: Likewise.

From-SVN: r227490

39 files changed:
libstdc++-v3/ChangeLog
libstdc++-v3/include/Makefile.am
libstdc++-v3/include/Makefile.in
libstdc++-v3/include/bits/mutex.h [new file with mode: 0644]
libstdc++-v3/include/std/condition_variable
libstdc++-v3/include/std/mutex
libstdc++-v3/testsuite/30_threads/recursive_timed_mutex/cons/1.cc
libstdc++-v3/testsuite/30_threads/recursive_timed_mutex/cons/assign_neg.cc
libstdc++-v3/testsuite/30_threads/recursive_timed_mutex/cons/copy_neg.cc
libstdc++-v3/testsuite/30_threads/recursive_timed_mutex/dest/destructor_locked.cc
libstdc++-v3/testsuite/30_threads/recursive_timed_mutex/lock/1.cc
libstdc++-v3/testsuite/30_threads/recursive_timed_mutex/lock/2.cc
libstdc++-v3/testsuite/30_threads/recursive_timed_mutex/try_lock/1.cc
libstdc++-v3/testsuite/30_threads/recursive_timed_mutex/try_lock/2.cc
libstdc++-v3/testsuite/30_threads/recursive_timed_mutex/try_lock_for/1.cc
libstdc++-v3/testsuite/30_threads/recursive_timed_mutex/try_lock_for/2.cc
libstdc++-v3/testsuite/30_threads/recursive_timed_mutex/try_lock_for/3.cc
libstdc++-v3/testsuite/30_threads/recursive_timed_mutex/try_lock_until/1.cc
libstdc++-v3/testsuite/30_threads/recursive_timed_mutex/try_lock_until/2.cc
libstdc++-v3/testsuite/30_threads/recursive_timed_mutex/unlock/1.cc
libstdc++-v3/testsuite/30_threads/timed_mutex/cons/1.cc
libstdc++-v3/testsuite/30_threads/timed_mutex/cons/assign_neg.cc
libstdc++-v3/testsuite/30_threads/timed_mutex/cons/copy_neg.cc
libstdc++-v3/testsuite/30_threads/timed_mutex/dest/destructor_locked.cc
libstdc++-v3/testsuite/30_threads/timed_mutex/lock/1.cc
libstdc++-v3/testsuite/30_threads/timed_mutex/requirements/standard_layout.cc
libstdc++-v3/testsuite/30_threads/timed_mutex/try_lock/1.cc
libstdc++-v3/testsuite/30_threads/timed_mutex/try_lock/2.cc
libstdc++-v3/testsuite/30_threads/timed_mutex/try_lock_for/1.cc
libstdc++-v3/testsuite/30_threads/timed_mutex/try_lock_for/2.cc
libstdc++-v3/testsuite/30_threads/timed_mutex/try_lock_for/3.cc
libstdc++-v3/testsuite/30_threads/timed_mutex/try_lock_until/1.cc
libstdc++-v3/testsuite/30_threads/timed_mutex/try_lock_until/2.cc
libstdc++-v3/testsuite/30_threads/timed_mutex/try_lock_until/57641.cc
libstdc++-v3/testsuite/30_threads/timed_mutex/unlock/1.cc
libstdc++-v3/testsuite/30_threads/unique_lock/cons/5.cc
libstdc++-v3/testsuite/30_threads/unique_lock/cons/6.cc
libstdc++-v3/testsuite/30_threads/unique_lock/locking/3.cc
libstdc++-v3/testsuite/30_threads/unique_lock/locking/4.cc

index 03fd3be590de0142f66a8eb859d7b560456ce698..030becbdbe62f720c189e60e756514814cbb6524 100644 (file)
@@ -1,3 +1,59 @@
+2015-09-03  Jonathan Wakely  <jwakely@redhat.com>
+
+       PR libstdc++/65704
+       * include/Makefile.am: Add <bits/mutex.h>.
+       * include/Makefile.in: Regenerate.
+       * include/bits/mutex.h (__mutex_base, mutex, lock_guard, unique_lock):
+       New file containing types moved from <mutex>.
+       * include/std/condition_variable: Include <bits/mutex.h> instead of
+       <mutex>.
+       * include/std/mutex (__mutex_base, mutex, lock_guard, unique_lock):
+       Move to <bits/mutex.h>.
+       *  testsuite/30_threads/recursive_timed_mutex/cons/1.cc: Remove
+       dg-require-gthreads-timed.
+       *  testsuite/30_threads/recursive_timed_mutex/cons/assign_neg.cc:
+       Likewise.
+       *  testsuite/30_threads/recursive_timed_mutex/cons/copy_neg.cc:
+       Likewise.
+       *  testsuite/30_threads/recursive_timed_mutex/dest/
+       destructor_locked.cc: Likewise.
+       *  testsuite/30_threads/recursive_timed_mutex/lock/1.cc: Likewise.
+       *  testsuite/30_threads/recursive_timed_mutex/lock/2.cc: Likewise.
+       *  testsuite/30_threads/recursive_timed_mutex/try_lock/1.cc: Likewise.
+       *  testsuite/30_threads/recursive_timed_mutex/try_lock/2.cc: Likewise.
+       *  testsuite/30_threads/recursive_timed_mutex/try_lock_for/1.cc:
+       Likewise.
+       *  testsuite/30_threads/recursive_timed_mutex/try_lock_for/2.cc:
+       Likewise.
+       *  testsuite/30_threads/recursive_timed_mutex/try_lock_for/3.cc:
+       Likewise.
+       *  testsuite/30_threads/recursive_timed_mutex/try_lock_until/1.cc:
+       Likewise.
+       *  testsuite/30_threads/recursive_timed_mutex/try_lock_until/2.cc:
+       Likewise.
+       *  testsuite/30_threads/recursive_timed_mutex/unlock/1.cc: Likewise.
+       *  testsuite/30_threads/timed_mutex/cons/1.cc: Likewise.
+       *  testsuite/30_threads/timed_mutex/cons/assign_neg.cc: Likewise.
+       *  testsuite/30_threads/timed_mutex/cons/copy_neg.cc: Likewise.
+       *  testsuite/30_threads/timed_mutex/dest/destructor_locked.cc:
+       Likewise.
+       *  testsuite/30_threads/timed_mutex/lock/1.cc: Likewise.
+       *  testsuite/30_threads/timed_mutex/requirements/standard_layout.cc:
+       Likewise.
+       *  testsuite/30_threads/timed_mutex/try_lock/1.cc: Likewise.
+       *  testsuite/30_threads/timed_mutex/try_lock/2.cc: Likewise.
+       *  testsuite/30_threads/timed_mutex/try_lock_for/1.cc: Likewise.
+       *  testsuite/30_threads/timed_mutex/try_lock_for/2.cc: Likewise.
+       *  testsuite/30_threads/timed_mutex/try_lock_for/3.cc: Likewise.
+       *  testsuite/30_threads/timed_mutex/try_lock_until/1.cc: Likewise.
+       *  testsuite/30_threads/timed_mutex/try_lock_until/2.cc: Likewise.
+       *  testsuite/30_threads/timed_mutex/try_lock_until/57641.cc: Likewise.
+       *  testsuite/30_threads/timed_mutex/unlock/1.cc: Likewise.
+       *  testsuite/30_threads/unique_lock/cons/5.cc: Likewise.
+       *  testsuite/30_threads/unique_lock/cons/6.cc: Likewise.
+       *  testsuite/30_threads/unique_lock/locking/3.cc: Likewise.
+       *  testsuite/30_threads/unique_lock/locking/4.cc: Likewise.
+
 2015-09-04  Edward Smith-Rowland  <3dw4rd@verizon.net>
            Jonathan Wakely  <jwakely@redhat.com>
 
index e579b22f1b1a1c4153a5c7a131d6fdecd5a49693..74100f299251568b518c018b90810b4c5bcc09c0 100644 (file)
@@ -122,6 +122,7 @@ bits_headers = \
        ${bits_srcdir}/mask_array.h \
        ${bits_srcdir}/memoryfwd.h \
        ${bits_srcdir}/move.h \
+       ${bits_srcdir}/mutex.h \
        ${bits_srcdir}/ostream.tcc \
        ${bits_srcdir}/ostream_insert.h \
        ${bits_srcdir}/parse_numbers.h \
index 47066705d23c17eca9b4c074f8831ac48ffb4bc8..b72df264531dee9623170adc5dabd309f4bed2aa 100644 (file)
@@ -412,6 +412,7 @@ bits_headers = \
        ${bits_srcdir}/mask_array.h \
        ${bits_srcdir}/memoryfwd.h \
        ${bits_srcdir}/move.h \
+       ${bits_srcdir}/mutex.h \
        ${bits_srcdir}/ostream.tcc \
        ${bits_srcdir}/ostream_insert.h \
        ${bits_srcdir}/parse_numbers.h \
diff --git a/libstdc++-v3/include/bits/mutex.h b/libstdc++-v3/include/bits/mutex.h
new file mode 100644 (file)
index 0000000..43f5b0b
--- /dev/null
@@ -0,0 +1,360 @@
+// std::mutex implementation -*- C++ -*-
+
+// Copyright (C) 2003-2015 Free Software Foundation, Inc.
+//
+// This file is part of the GNU ISO C++ Library.  This library is free
+// software; you can redistribute it and/or modify it under the
+// terms of the GNU General Public License as published by the
+// Free Software Foundation; either version 3, or (at your option)
+// any later version.
+
+// This library is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+// GNU General Public License for more details.
+
+// Under Section 7 of GPL version 3, you are granted additional
+// permissions described in the GCC Runtime Library Exception, version
+// 3.1, as published by the Free Software Foundation.
+
+// You should have received a copy of the GNU General Public License and
+// a copy of the GCC Runtime Library Exception along with this program;
+// see the files COPYING3 and COPYING.RUNTIME respectively.  If not, see
+// <http://www.gnu.org/licenses/>.
+
+/** @file bits/mutex.h
+ *  This is an internal header file, included by other library headers.
+ *  Do not attempt to use it directly. @headername{mutex}
+ */
+
+#ifndef _GLIBCXX_MUTEX_H
+#define _GLIBCXX_MUTEX_H 1
+
+#pragma GCC system_header
+
+#if __cplusplus < 201103L
+# include <bits/c++0x_warning.h>
+#else
+
+#include <system_error>
+#include <bits/functexcept.h>
+#include <bits/gthr.h>
+#include <bits/move.h> // for std::swap
+
+#ifdef _GLIBCXX_USE_C99_STDINT_TR1
+
+namespace std _GLIBCXX_VISIBILITY(default)
+{
+_GLIBCXX_BEGIN_NAMESPACE_VERSION
+
+  /**
+   * @defgroup mutexes Mutexes
+   * @ingroup concurrency
+   *
+   * Classes for mutex support.
+   * @{
+   */
+
+#ifdef _GLIBCXX_HAS_GTHREADS
+  // Common base class for std::mutex and std::timed_mutex
+  class __mutex_base
+  {
+  protected:
+    typedef __gthread_mutex_t                  __native_type;
+
+#ifdef __GTHREAD_MUTEX_INIT
+    __native_type  _M_mutex = __GTHREAD_MUTEX_INIT;
+
+    constexpr __mutex_base() noexcept = default;
+#else
+    __native_type  _M_mutex;
+
+    __mutex_base() noexcept
+    {
+      // XXX EAGAIN, ENOMEM, EPERM, EBUSY(may), EINVAL(may)
+      __GTHREAD_MUTEX_INIT_FUNCTION(&_M_mutex);
+    }
+
+    ~__mutex_base() noexcept { __gthread_mutex_destroy(&_M_mutex); }
+#endif
+
+    __mutex_base(const __mutex_base&) = delete;
+    __mutex_base& operator=(const __mutex_base&) = delete;
+  };
+
+  /// mutex
+  class mutex : private __mutex_base
+  {
+  public:
+    typedef __native_type*                     native_handle_type;
+
+#ifdef __GTHREAD_MUTEX_INIT
+    constexpr
+#endif
+    mutex() noexcept = default;
+    ~mutex() = default;
+
+    mutex(const mutex&) = delete;
+    mutex& operator=(const mutex&) = delete;
+
+    void
+    lock()
+    {
+      int __e = __gthread_mutex_lock(&_M_mutex);
+
+      // EINVAL, EAGAIN, EBUSY, EINVAL, EDEADLK(may)
+      if (__e)
+       __throw_system_error(__e);
+    }
+
+    bool
+    try_lock() noexcept
+    {
+      // XXX EINVAL, EAGAIN, EBUSY
+      return !__gthread_mutex_trylock(&_M_mutex);
+    }
+
+    void
+    unlock()
+    {
+      // XXX EINVAL, EAGAIN, EPERM
+      __gthread_mutex_unlock(&_M_mutex);
+    }
+
+    native_handle_type
+    native_handle()
+    { return &_M_mutex; }
+  };
+
+#endif // _GLIBCXX_HAS_GTHREADS
+
+  /// Do not acquire ownership of the mutex.
+  struct defer_lock_t { };
+
+  /// Try to acquire ownership of the mutex without blocking.
+  struct try_to_lock_t { };
+
+  /// Assume the calling thread has already obtained mutex ownership
+  /// and manage it.
+  struct adopt_lock_t { };
+
+  constexpr defer_lock_t       defer_lock { };
+  constexpr try_to_lock_t      try_to_lock { };
+  constexpr adopt_lock_t       adopt_lock { };
+
+  /// @brief  Scoped lock idiom.
+  // Acquire the mutex here with a constructor call, then release with
+  // the destructor call in accordance with RAII style.
+  template<typename _Mutex>
+    class lock_guard
+    {
+    public:
+      typedef _Mutex mutex_type;
+
+      explicit lock_guard(mutex_type& __m) : _M_device(__m)
+      { _M_device.lock(); }
+
+      lock_guard(mutex_type& __m, adopt_lock_t) : _M_device(__m)
+      { } // calling thread owns mutex
+
+      ~lock_guard()
+      { _M_device.unlock(); }
+
+      lock_guard(const lock_guard&) = delete;
+      lock_guard& operator=(const lock_guard&) = delete;
+
+    private:
+      mutex_type&  _M_device;
+    };
+
+  /// unique_lock
+  template<typename _Mutex>
+    class unique_lock
+    {
+    public:
+      typedef _Mutex mutex_type;
+
+      unique_lock() noexcept
+      : _M_device(0), _M_owns(false)
+      { }
+
+      explicit unique_lock(mutex_type& __m)
+      : _M_device(std::__addressof(__m)), _M_owns(false)
+      {
+       lock();
+       _M_owns = true;
+      }
+
+      unique_lock(mutex_type& __m, defer_lock_t) noexcept
+      : _M_device(std::__addressof(__m)), _M_owns(false)
+      { }
+
+      unique_lock(mutex_type& __m, try_to_lock_t)
+      : _M_device(std::__addressof(__m)), _M_owns(_M_device->try_lock())
+      { }
+
+      unique_lock(mutex_type& __m, adopt_lock_t)
+      : _M_device(std::__addressof(__m)), _M_owns(true)
+      {
+       // XXX calling thread owns mutex
+      }
+
+      template<typename _Clock, typename _Duration>
+       unique_lock(mutex_type& __m,
+                   const chrono::time_point<_Clock, _Duration>& __atime)
+       : _M_device(std::__addressof(__m)),
+         _M_owns(_M_device->try_lock_until(__atime))
+       { }
+
+      template<typename _Rep, typename _Period>
+       unique_lock(mutex_type& __m,
+                   const chrono::duration<_Rep, _Period>& __rtime)
+       : _M_device(std::__addressof(__m)),
+         _M_owns(_M_device->try_lock_for(__rtime))
+       { }
+
+      ~unique_lock()
+      {
+       if (_M_owns)
+         unlock();
+      }
+
+      unique_lock(const unique_lock&) = delete;
+      unique_lock& operator=(const unique_lock&) = delete;
+
+      unique_lock(unique_lock&& __u) noexcept
+      : _M_device(__u._M_device), _M_owns(__u._M_owns)
+      {
+       __u._M_device = 0;
+       __u._M_owns = false;
+      }
+
+      unique_lock& operator=(unique_lock&& __u) noexcept
+      {
+       if(_M_owns)
+         unlock();
+
+       unique_lock(std::move(__u)).swap(*this);
+
+       __u._M_device = 0;
+       __u._M_owns = false;
+
+       return *this;
+      }
+
+      void
+      lock()
+      {
+       if (!_M_device)
+         __throw_system_error(int(errc::operation_not_permitted));
+       else if (_M_owns)
+         __throw_system_error(int(errc::resource_deadlock_would_occur));
+       else
+         {
+           _M_device->lock();
+           _M_owns = true;
+         }
+      }
+
+      bool
+      try_lock()
+      {
+       if (!_M_device)
+         __throw_system_error(int(errc::operation_not_permitted));
+       else if (_M_owns)
+         __throw_system_error(int(errc::resource_deadlock_would_occur));
+       else
+         {
+           _M_owns = _M_device->try_lock();
+           return _M_owns;
+         }
+      }
+
+      template<typename _Clock, typename _Duration>
+       bool
+       try_lock_until(const chrono::time_point<_Clock, _Duration>& __atime)
+       {
+         if (!_M_device)
+           __throw_system_error(int(errc::operation_not_permitted));
+         else if (_M_owns)
+           __throw_system_error(int(errc::resource_deadlock_would_occur));
+         else
+           {
+             _M_owns = _M_device->try_lock_until(__atime);
+             return _M_owns;
+           }
+       }
+
+      template<typename _Rep, typename _Period>
+       bool
+       try_lock_for(const chrono::duration<_Rep, _Period>& __rtime)
+       {
+         if (!_M_device)
+           __throw_system_error(int(errc::operation_not_permitted));
+         else if (_M_owns)
+           __throw_system_error(int(errc::resource_deadlock_would_occur));
+         else
+           {
+             _M_owns = _M_device->try_lock_for(__rtime);
+             return _M_owns;
+           }
+        }
+
+      void
+      unlock()
+      {
+       if (!_M_owns)
+         __throw_system_error(int(errc::operation_not_permitted));
+       else if (_M_device)
+         {
+           _M_device->unlock();
+           _M_owns = false;
+         }
+      }
+
+      void
+      swap(unique_lock& __u) noexcept
+      {
+       std::swap(_M_device, __u._M_device);
+       std::swap(_M_owns, __u._M_owns);
+      }
+
+      mutex_type*
+      release() noexcept
+      {
+       mutex_type* __ret = _M_device;
+       _M_device = 0;
+       _M_owns = false;
+       return __ret;
+      }
+
+      bool
+      owns_lock() const noexcept
+      { return _M_owns; }
+
+      explicit operator bool() const noexcept
+      { return owns_lock(); }
+
+      mutex_type*
+      mutex() const noexcept
+      { return _M_device; }
+
+    private:
+      mutex_type*      _M_device;
+      bool             _M_owns; // XXX use atomic_bool
+    };
+
+  /// Swap overload for unique_lock objects.
+  template<typename _Mutex>
+    inline void
+    swap(unique_lock<_Mutex>& __x, unique_lock<_Mutex>& __y) noexcept
+    { __x.swap(__y); }
+
+  // @} group mutexes
+_GLIBCXX_END_NAMESPACE_VERSION
+} // namespace
+#endif // _GLIBCXX_USE_C99_STDINT_TR1
+
+#endif // C++11
+
+#endif // _GLIBCXX_MUTEX_H
index fbed043f3c743b2062e14edbc45fecae67570f3d..4714774f1c3d96d421eb4147620322c3f5994b84 100644 (file)
@@ -36,7 +36,7 @@
 #else
 
 #include <chrono>
-#include <mutex>
+#include <bits/mutex.h>
 #include <ext/concurrence.h>
 #include <bits/alloc_traits.h>
 #include <bits/allocator.h>
index fbf17405b7b427ae7d31862867f3d464908de27f..47141d95477f9e1c30bef4b60c08547cf84f03cf 100644 (file)
 #include <type_traits>
 #include <functional>
 #include <system_error>
-#include <bits/functexcept.h>
-#include <bits/gthr.h>
-#include <bits/move.h> // for std::swap
+#include <bits/mutex.h>
+#if ! _GTHREAD_USE_MUTEX_TIMEDLOCK
+# include <condition_variable>
+# include <thread>
+#endif
 
 #ifdef _GLIBCXX_USE_C99_STDINT_TR1
 
@@ -51,32 +53,12 @@ namespace std _GLIBCXX_VISIBILITY(default)
 {
 _GLIBCXX_BEGIN_NAMESPACE_VERSION
 
-#ifdef _GLIBCXX_HAS_GTHREADS
-  // Common base class for std::mutex and std::timed_mutex
-  class __mutex_base
-  {
-  protected:
-    typedef __gthread_mutex_t                  __native_type;
-
-#ifdef __GTHREAD_MUTEX_INIT
-    __native_type  _M_mutex = __GTHREAD_MUTEX_INIT;
-
-    constexpr __mutex_base() noexcept = default;
-#else
-    __native_type  _M_mutex;
-
-    __mutex_base() noexcept
-    {
-      // XXX EAGAIN, ENOMEM, EPERM, EBUSY(may), EINVAL(may)
-      __GTHREAD_MUTEX_INIT_FUNCTION(&_M_mutex);
-    }
-
-    ~__mutex_base() noexcept { __gthread_mutex_destroy(&_M_mutex); }
-#endif
+  /**
+   * @ingroup mutexes
+   * @{
+   */
 
-    __mutex_base(const __mutex_base&) = delete;
-    __mutex_base& operator=(const __mutex_base&) = delete;
-  };
+#ifdef _GLIBCXX_HAS_GTHREADS
 
   // Common base class for std::recursive_mutex and std::recursive_timed_mutex
   class __recursive_mutex_base
@@ -105,58 +87,6 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
 #endif
   };
 
-  /**
-   * @defgroup mutexes Mutexes
-   * @ingroup concurrency
-   *
-   * Classes for mutex support.
-   * @{
-   */
-
-  /// mutex
-  class mutex : private __mutex_base
-  {
-  public:
-    typedef __native_type*                     native_handle_type;
-
-#ifdef __GTHREAD_MUTEX_INIT
-    constexpr
-#endif
-    mutex() noexcept = default;
-    ~mutex() = default;
-
-    mutex(const mutex&) = delete;
-    mutex& operator=(const mutex&) = delete;
-
-    void
-    lock()
-    {
-      int __e = __gthread_mutex_lock(&_M_mutex);
-
-      // EINVAL, EAGAIN, EBUSY, EINVAL, EDEADLK(may)
-      if (__e)
-       __throw_system_error(__e);
-    }
-
-    bool
-    try_lock() noexcept
-    {
-      // XXX EINVAL, EAGAIN, EBUSY
-      return !__gthread_mutex_trylock(&_M_mutex);
-    }
-
-    void
-    unlock()
-    {
-      // XXX EINVAL, EAGAIN, EPERM
-      __gthread_mutex_unlock(&_M_mutex);
-    }
-
-    native_handle_type
-    native_handle()
-    { return &_M_mutex; }
-  };
-
   /// recursive_mutex
   class recursive_mutex : private __recursive_mutex_base
   {
@@ -359,230 +289,177 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
       _M_timedlock(const __gthread_time_t& __ts)
       { return !__gthread_recursive_mutex_timedlock(&_M_mutex, &__ts); }
   };
-#endif
-#endif // _GLIBCXX_HAS_GTHREADS
-
-  /// Do not acquire ownership of the mutex.
-  struct defer_lock_t { };
-
-  /// Try to acquire ownership of the mutex without blocking.
-  struct try_to_lock_t { };
-
-  /// Assume the calling thread has already obtained mutex ownership
-  /// and manage it.
-  struct adopt_lock_t { };
-
-  constexpr defer_lock_t       defer_lock { };
-  constexpr try_to_lock_t      try_to_lock { };
-  constexpr adopt_lock_t       adopt_lock { };
-
-  /// @brief  Scoped lock idiom.
-  // Acquire the mutex here with a constructor call, then release with
-  // the destructor call in accordance with RAII style.
-  template<typename _Mutex>
-    class lock_guard
-    {
-    public:
-      typedef _Mutex mutex_type;
 
-      explicit lock_guard(mutex_type& __m) : _M_device(__m)
-      { _M_device.lock(); }
+#else // !_GTHREAD_USE_MUTEX_TIMEDLOCK
 
-      lock_guard(mutex_type& __m, adopt_lock_t) : _M_device(__m)
-      { } // calling thread owns mutex
+  /// timed_mutex
+  class timed_mutex
+  {
+    mutex              _M_mut;
+    condition_variable _M_cv;
+    bool               _M_locked = false;
 
-      ~lock_guard()
-      { _M_device.unlock(); }
+  public:
 
-      lock_guard(const lock_guard&) = delete;
-      lock_guard& operator=(const lock_guard&) = delete;
+    timed_mutex() = default;
+    ~timed_mutex() { _GLIBCXX_DEBUG_ASSERT( !_M_locked ); }
 
-    private:
-      mutex_type&  _M_device;
-    };
+    timed_mutex(const timed_mutex&) = delete;
+    timed_mutex& operator=(const timed_mutex&) = delete;
 
-  /// unique_lock
-  template<typename _Mutex>
-    class unique_lock
+    void
+    lock()
     {
-    public:
-      typedef _Mutex mutex_type;
+      unique_lock<mutex> __lk(_M_mut);
+      _M_cv.wait(__lk, [&]{ return !_M_locked; });
+      _M_locked = true;
+    }
 
-      unique_lock() noexcept
-      : _M_device(0), _M_owns(false)
-      { }
+    bool
+    try_lock()
+    {
+      lock_guard<mutex> __lk(_M_mut);
+      if (_M_locked)
+       return false;
+      _M_locked = true;
+      return true;
+    }
 
-      explicit unique_lock(mutex_type& __m)
-      : _M_device(std::__addressof(__m)), _M_owns(false)
+    template<typename _Rep, typename _Period>
+      bool
+      try_lock_for(const chrono::duration<_Rep, _Period>& __rtime)
       {
-       lock();
-       _M_owns = true;
+       unique_lock<mutex> __lk(_M_mut);
+       if (!_M_cv.wait_for(__lk, __rtime, [&]{ return !_M_locked; }))
+         return false;
+       _M_locked = true;
+       return true;
       }
 
-      unique_lock(mutex_type& __m, defer_lock_t) noexcept
-      : _M_device(std::__addressof(__m)), _M_owns(false)
-      { }
-
-      unique_lock(mutex_type& __m, try_to_lock_t)
-      : _M_device(std::__addressof(__m)), _M_owns(_M_device->try_lock())
-      { }
-
-      unique_lock(mutex_type& __m, adopt_lock_t)
-      : _M_device(std::__addressof(__m)), _M_owns(true)
+    template<typename _Clock, typename _Duration>
+      bool
+      try_lock_until(const chrono::time_point<_Clock, _Duration>& __atime)
       {
-       // XXX calling thread owns mutex
+       unique_lock<mutex> __lk(_M_mut);
+       if (!_M_cv.wait_until(__lk, __atime, [&]{ return !_M_locked; }))
+         return false;
+       _M_locked = true;
+       return true;
       }
 
-      template<typename _Clock, typename _Duration>
-       unique_lock(mutex_type& __m,
-                   const chrono::time_point<_Clock, _Duration>& __atime)
-       : _M_device(std::__addressof(__m)),
-         _M_owns(_M_device->try_lock_until(__atime))
-       { }
+    void
+    unlock()
+    {
+      lock_guard<mutex> __lk(_M_mut);
+      _GLIBCXX_DEBUG_ASSERT( _M_locked );
+      _M_locked = false;
+      _M_cv.notify_one();
+    }
+  };
 
-      template<typename _Rep, typename _Period>
-       unique_lock(mutex_type& __m,
-                   const chrono::duration<_Rep, _Period>& __rtime)
-       : _M_device(std::__addressof(__m)),
-         _M_owns(_M_device->try_lock_for(__rtime))
-       { }
+  /// recursive_timed_mutex
+  class recursive_timed_mutex
+  {
+    mutex              _M_mut;
+    condition_variable _M_cv;
+    thread::id         _M_owner;
+    unsigned           _M_count = 0;
 
-      ~unique_lock()
-      {
-       if (_M_owns)
-         unlock();
-      }
+    // Predicate type that tests whether the current thread can lock a mutex.
+    struct _Can_lock
+    {
+      _Can_lock(const recursive_timed_mutex* __mx)
+      : _M_mx(__mx), _M_caller(this_thread::get_id()) { }
 
-      unique_lock(const unique_lock&) = delete;
-      unique_lock& operator=(const unique_lock&) = delete;
+      // Returns true if the mutex is unlocked or is locked by _M_caller.
+      bool
+      operator()() const noexcept
+      { return _M_mx->_M_count == 0 || _M_mx->_M_owner == _M_caller; }
 
-      unique_lock(unique_lock&& __u) noexcept
-      : _M_device(__u._M_device), _M_owns(__u._M_owns)
-      {
-       __u._M_device = 0;
-       __u._M_owns = false;
-      }
+      const recursive_timed_mutex* _M_mx;
+      thread::id _M_caller;
+    };
 
-      unique_lock& operator=(unique_lock&& __u) noexcept
-      {
-       if(_M_owns)
-         unlock();
+  public:
 
-       unique_lock(std::move(__u)).swap(*this);
+    recursive_timed_mutex() = default;
+    ~recursive_timed_mutex() { _GLIBCXX_DEBUG_ASSERT( _M_count == 0 ); }
 
-       __u._M_device = 0;
-       __u._M_owns = false;
+    recursive_timed_mutex(const recursive_timed_mutex&) = delete;
+    recursive_timed_mutex& operator=(const recursive_timed_mutex&) = delete;
 
-       return *this;
-      }
+    void
+    lock()
+    {
+      _Can_lock __can_lock{this};
+      unique_lock<mutex> __lk(_M_mut);
+      _M_cv.wait(__lk, __can_lock);
+      if (_M_count == -1u)
+       __throw_system_error(EAGAIN); // [thread.timedmutex.recursive]/3
+      _M_owner = __id;
+      ++_M_count;
+    }
+
+    bool
+    try_lock()
+    {
+      _Can_lock __can_lock{this};
+      lock_guard<mutex> __lk(_M_mut);
+      if (!__can_lock())
+       return false;
+      if (_M_count == -1u)
+       return false;
+      _M_owner = __id;
+      ++_M_count;
+      return true;
+    }
 
-      void
-      lock()
+    template<typename _Rep, typename _Period>
+      bool
+      try_lock_for(const chrono::duration<_Rep, _Period>& __rtime)
       {
-       if (!_M_device)
-         __throw_system_error(int(errc::operation_not_permitted));
-       else if (_M_owns)
-         __throw_system_error(int(errc::resource_deadlock_would_occur));
-       else
-         {
-           _M_device->lock();
-           _M_owns = true;
-         }
+       _Can_lock __can_lock{this};
+       unique_lock<mutex> __lk(_M_mut);
+       if (!_M_cv.wait_for(__lk, __rtime, __can_lock);
+         return false;
+       if (_M_count == -1u)
+         return false;
+       _M_owner = __id;
+       ++_M_count;
+       return true;
       }
 
+    template<typename _Clock, typename _Duration>
       bool
-      try_lock()
+      try_lock_until(const chrono::time_point<_Clock, _Duration>& __atime)
       {
-       if (!_M_device)
-         __throw_system_error(int(errc::operation_not_permitted));
-       else if (_M_owns)
-         __throw_system_error(int(errc::resource_deadlock_would_occur));
-       else
-         {
-           _M_owns = _M_device->try_lock();
-           return _M_owns;
-         }
+       _Can_lock __can_lock{this};
+       unique_lock<mutex> __lk(_M_mut);
+       if (!_M_cv.wait_until(__lk, __atime, __can_lock);
+         return false;
+       if (_M_count == -1u)
+         return false;
+       _M_owner = __id;
+       ++_M_count;
+       return true;
       }
 
-      template<typename _Clock, typename _Duration>
-       bool
-       try_lock_until(const chrono::time_point<_Clock, _Duration>& __atime)
+    void
+    unlock()
+    {
+      lock_guard<mutex> __lk(_M_mut);
+      _GLIBCXX_DEBUG_ASSERT( _M_owner == this_thread::get_id() );
+      _GLIBCXX_DEBUG_ASSERT( _M_count > 0 );
+      if (--_M_count == 0)
        {
-         if (!_M_device)
-           __throw_system_error(int(errc::operation_not_permitted));
-         else if (_M_owns)
-           __throw_system_error(int(errc::resource_deadlock_would_occur));
-         else
-           {
-             _M_owns = _M_device->try_lock_until(__atime);
-             return _M_owns;
-           }
+         _M_owner = {};
+         _M_cv.notify_one();
        }
+    }
+  };
 
-      template<typename _Rep, typename _Period>
-       bool
-       try_lock_for(const chrono::duration<_Rep, _Period>& __rtime)
-       {
-         if (!_M_device)
-           __throw_system_error(int(errc::operation_not_permitted));
-         else if (_M_owns)
-           __throw_system_error(int(errc::resource_deadlock_would_occur));
-         else
-           {
-             _M_owns = _M_device->try_lock_for(__rtime);
-             return _M_owns;
-           }
-        }
-
-      void
-      unlock()
-      {
-       if (!_M_owns)
-         __throw_system_error(int(errc::operation_not_permitted));
-       else if (_M_device)
-         {
-           _M_device->unlock();
-           _M_owns = false;
-         }
-      }
-
-      void
-      swap(unique_lock& __u) noexcept
-      {
-       std::swap(_M_device, __u._M_device);
-       std::swap(_M_owns, __u._M_owns);
-      }
-
-      mutex_type*
-      release() noexcept
-      {
-       mutex_type* __ret = _M_device;
-       _M_device = 0;
-       _M_owns = false;
-       return __ret;
-      }
-
-      bool
-      owns_lock() const noexcept
-      { return _M_owns; }
-
-      explicit operator bool() const noexcept
-      { return owns_lock(); }
-
-      mutex_type*
-      mutex() const noexcept
-      { return _M_device; }
-
-    private:
-      mutex_type*      _M_device;
-      bool             _M_owns; // XXX use atomic_bool
-    };
-
-  /// Swap overload for unique_lock objects.
-  template<typename _Mutex>
-    inline void
-    swap(unique_lock<_Mutex>& __x, unique_lock<_Mutex>& __y) noexcept
-    { __x.swap(__y); }
+#endif
+#endif // _GLIBCXX_HAS_GTHREADS
 
   template<typename _Lock>
     inline unique_lock<_Lock>
index a3e1b34aa90c22a7ecee13f04d54e40f4a3076ac..6e4c7f508e7a008231f12ed1d7cfe11e828de961 100644 (file)
@@ -3,7 +3,6 @@
 // { dg-options " -std=gnu++11 -pthreads" { target *-*-solaris* } }
 // { dg-options " -std=gnu++11 " { target *-*-cygwin *-*-rtems* *-*-darwin* } }
 // { dg-require-cstdint "" }
-// { dg-require-gthreads-timed "" }
 
 // Copyright (C) 2008-2015 Free Software Foundation, Inc.
 //
index 6e50632dfcc313bac788673890b74df7650dee6d..62264feb147dfa3d351ee1af03c37b7e3b35ac9b 100644 (file)
@@ -1,7 +1,6 @@
 // { dg-do compile }
 // { dg-options "-std=gnu++11" }
 // { dg-require-cstdint "" }
-// { dg-require-gthreads-timed "" }
 
 // Copyright (C) 2008-2015 Free Software Foundation, Inc.
 //
index 480c1cc1d9ee5e93e4dea7a28cdf244f69a2f838..4f2c3cc3f010e93ad91a0d479da24a89d1cceff7 100644 (file)
@@ -1,7 +1,6 @@
 // { dg-do compile }
 // { dg-options "-std=gnu++11" }
 // { dg-require-cstdint "" }
-// { dg-require-gthreads-timed "" }
 
 // Copyright (C) 2008-2015 Free Software Foundation, Inc.
 //
index f8236672092c9574f1cfc6c325f87c4eb4280f00..e06caecf51bd0a3c2e96336ab8026e755199f78e 100644 (file)
@@ -3,7 +3,6 @@
 // { dg-options " -std=gnu++11 -pthreads" { target *-*-solaris* } }
 // { dg-options " -std=gnu++11 " { target *-*-cygwin *-*-rtems* *-*-darwin* } }
 // { dg-require-cstdint "" }
-// { dg-require-gthreads-timed "" }
 
 // Copyright (C) 2008-2015 Free Software Foundation, Inc.
 //
index 0b5d3aad742df57845e09c9a89272fd3ab33d9c0..104f0a96a3eb2f117fb5a8b309464678372b839d 100644 (file)
@@ -3,7 +3,6 @@
 // { dg-options " -std=gnu++11 -pthreads" { target *-*-solaris* } }
 // { dg-options " -std=gnu++11 " { target *-*-cygwin *-*-rtems* *-*-darwin* } }
 // { dg-require-cstdint "" }
-// { dg-require-gthreads-timed "" }
 
 // Copyright (C) 2008-2015 Free Software Foundation, Inc.
 //
index c2b56ea9ce6dc34e5645fdf5eeda4a36a644e8b3..d4528b58a598a53d87fb52c01d55d93028d751cb 100644 (file)
@@ -3,7 +3,6 @@
 // { dg-options " -std=gnu++11 -pthreads" { target *-*-solaris* } }
 // { dg-options " -std=gnu++11 " { target *-*-cygwin *-*-rtems* *-*-darwin* } }
 // { dg-require-cstdint "" }
-// { dg-require-gthreads-timed "" }
 
 // Copyright (C) 2008-2015 Free Software Foundation, Inc.
 //
index 3afc43a2f8dc0d3a1a3e0c09040115c1788c5e1a..f56afc81f0a67e900d2809a5acf5a67ece33b7a5 100644 (file)
@@ -3,7 +3,6 @@
 // { dg-options " -std=gnu++11 -pthreads" { target *-*-solaris* } }
 // { dg-options " -std=gnu++11 " { target *-*-cygwin *-*-rtems* *-*-darwin* } }
 // { dg-require-cstdint "" }
-// { dg-require-gthreads-timed "" }
 
 // Copyright (C) 2008-2015 Free Software Foundation, Inc.
 //
index 335fc8f49b46a72fb597d252d1840962ce1247d9..5ec212bdf7823b795e42960243d68ad71eb61208 100644 (file)
@@ -3,7 +3,6 @@
 // { dg-options "-std=gnu++11 -pthreads" { target *-*-solaris* } }
 // { dg-options "-std=gnu++11 " { target *-*-cygwin *-*-rtems* *-*-darwin* } }
 // { dg-require-cstdint "" }
-// { dg-require-gthreads-timed "" }
 
 // Copyright (C) 2008-2015 Free Software Foundation, Inc.
 //
index 043e4c27e4450af47433b87093574f4e4976e721..c17525f8589066e6cc9e23ea17c96092c9ede11e 100644 (file)
@@ -3,7 +3,6 @@
 // { dg-options " -std=gnu++11 -pthreads" { target *-*-solaris* } }
 // { dg-options " -std=gnu++11 " { target *-*-cygwin *-*-rtems* *-*-darwin* } }
 // { dg-require-cstdint "" }
-// { dg-require-gthreads-timed "" }
 
 // Copyright (C) 2008-2015 Free Software Foundation, Inc.
 //
index 8eb3e4b2cc58ec8d8fc02fcbd93b23553f81cfd5..e9bc37135f94978d76c2f35c643abc207caf8b26 100644 (file)
@@ -3,7 +3,6 @@
 // { dg-options " -std=gnu++11 -pthreads" { target *-*-solaris* } }
 // { dg-options " -std=gnu++11 " { target *-*-cygwin *-*-rtems* *-*-darwin* } }
 // { dg-require-cstdint "" }
-// { dg-require-gthreads-timed "" }
 
 // Copyright (C) 2008-2015 Free Software Foundation, Inc.
 //
index 33bdcca55adecf0470460c2d7f72590bf2be00d7..33ec4f2ff409deb17cb423e82344475941ab9a9a 100644 (file)
@@ -3,7 +3,6 @@
 // { dg-options " -std=gnu++11 -pthreads" { target *-*-solaris* } }
 // { dg-options " -std=gnu++11 " { target *-*-cygwin *-*-rtems* *-*-darwin* } }
 // { dg-require-cstdint "" }
-// { dg-require-gthreads-timed "" }
 
 // Copyright (C) 2008-2015 Free Software Foundation, Inc.
 //
index 3afc43a2f8dc0d3a1a3e0c09040115c1788c5e1a..f56afc81f0a67e900d2809a5acf5a67ece33b7a5 100644 (file)
@@ -3,7 +3,6 @@
 // { dg-options " -std=gnu++11 -pthreads" { target *-*-solaris* } }
 // { dg-options " -std=gnu++11 " { target *-*-cygwin *-*-rtems* *-*-darwin* } }
 // { dg-require-cstdint "" }
-// { dg-require-gthreads-timed "" }
 
 // Copyright (C) 2008-2015 Free Software Foundation, Inc.
 //
index 6269da0b8145ef33fca9b3ba9336243fb312f150..367134a3957aedea1e929ebf3e628ef812a70dd7 100644 (file)
@@ -3,7 +3,6 @@
 // { dg-options " -std=gnu++11 -pthreads" { target *-*-solaris* } }
 // { dg-options " -std=gnu++11 " { target *-*-cygwin *-*-rtems* *-*-darwin* } }
 // { dg-require-cstdint "" }
-// { dg-require-gthreads-timed "" }
 
 // Copyright (C) 2008-2015 Free Software Foundation, Inc.
 //
index 4477fbfb5df8f3853fdad5438e318b12c85af8f0..44e0b15d0849a1648a43ef9465e2bfd3d447262b 100644 (file)
@@ -3,7 +3,6 @@
 // { dg-options " -std=gnu++11 -pthreads" { target *-*-solaris* } }
 // { dg-options " -std=gnu++11 " { target *-*-cygwin *-*-rtems* *-*-darwin* } }
 // { dg-require-cstdint "" }
-// { dg-require-gthreads-timed "" }
 
 // Copyright (C) 2008-2015 Free Software Foundation, Inc.
 //
index 56e489b503b849d4a0713c7af407c9ef929be6de..d6664fb9db38424eec7bc2bd1bf8f20c81df7d6b 100644 (file)
@@ -3,7 +3,6 @@
 // { dg-options " -std=gnu++11 -pthreads" { target *-*-solaris* } }
 // { dg-options " -std=gnu++11 " { target *-*-cygwin *-*-rtems* *-*-darwin* } }
 // { dg-require-cstdint "" }
-// { dg-require-gthreads-timed "" }
 
 // Copyright (C) 2008-2015 Free Software Foundation, Inc.
 //
index d953a4cfb3ac62d536053e8a96afc3529807725f..c6ba40286419ab305cf8924abaeae8566441e220 100644 (file)
@@ -1,7 +1,6 @@
 // { dg-do compile }
 // { dg-options "-std=gnu++11" }
 // { dg-require-cstdint "" }
-// { dg-require-gthreads-timed "" }
 
 // Copyright (C) 2008-2015 Free Software Foundation, Inc.
 //
index 1acb2318bb5aaf42cd1101091aefa00efe3c3a3e..1874b042deb07e20c4b02f8dc879a7974732d56e 100644 (file)
@@ -1,7 +1,6 @@
 // { dg-do compile }
 // { dg-options "-std=gnu++11" }
 // { dg-require-cstdint "" }
-// { dg-require-gthreads-timed "" }
 
 // Copyright (C) 2008-2015 Free Software Foundation, Inc.
 //
index 180174ca2cd6d770924a747e8c048db663af6826..5e7d27318460127b17c27af80ad7e7559e352766 100644 (file)
@@ -3,7 +3,6 @@
 // { dg-options " -std=gnu++11 -pthreads" { target *-*-solaris* } }
 // { dg-options " -std=gnu++11 " { target *-*-cygwin *-*-rtems* *-*-darwin* } }
 // { dg-require-cstdint "" }
-// { dg-require-gthreads-timed "" }
 
 // Copyright (C) 2008-2015 Free Software Foundation, Inc.
 //
index 5eb4bdd467250fe4cecff1dd7b25e7599d555ddd..26d4c784c827687f12fe53d2c66ef0a318b32977 100644 (file)
@@ -3,7 +3,6 @@
 // { dg-options " -std=gnu++11 -pthreads" { target *-*-solaris* } }
 // { dg-options " -std=gnu++11 " { target *-*-cygwin *-*-rtems* *-*-darwin* } }
 // { dg-require-cstdint "" }
-// { dg-require-gthreads-timed "" }
 
 // Copyright (C) 2008-2015 Free Software Foundation, Inc.
 //
index f94228e8a760428b1047d70a3a0a75377536659a..e053aeb0c4f8e2eb05efe174ccd2609304bace20 100644 (file)
@@ -1,7 +1,6 @@
 // { dg-do compile }
 // { dg-options "-std=gnu++11" }
 // { dg-require-cstdint "" }
-// { dg-require-gthreads-timed "" }
 
 // Copyright (C) 2009-2015 Free Software Foundation, Inc.
 //
index 7766eb6b20e73844808a7d7bfaca4af8f6e27f75..029f779d0cfa37e58e55b715da92ca76aa8a5189 100644 (file)
@@ -3,7 +3,6 @@
 // { dg-options " -std=gnu++11 -pthreads" { target *-*-solaris* } }
 // { dg-options " -std=gnu++11 " { target *-*-cygwin *-*-rtems* *-*-darwin* } }
 // { dg-require-cstdint "" }
-// { dg-require-gthreads-timed "" }
 
 // Copyright (C) 2008-2015 Free Software Foundation, Inc.
 //
index f99e44233fec4190ce2731b880eb85dfa4d32d6f..5dc33165877dddd507cbead16a5775237d85aaec 100644 (file)
@@ -3,7 +3,6 @@
 // { dg-options " -std=gnu++11 -pthreads" { target *-*-solaris* } }
 // { dg-options " -std=gnu++11 " { target *-*-cygwin *-*-rtems* *-*-darwin* } }
 // { dg-require-cstdint "" }
-// { dg-require-gthreads-timed "" }
 
 // Copyright (C) 2008-2015 Free Software Foundation, Inc.
 //
index 7af70c1d347d7187ef17c5eaa03cc26363c8a999..5791aa1b6f2e00d1b149d512a7378eb855c6c8aa 100644 (file)
@@ -3,7 +3,6 @@
 // { dg-options " -std=gnu++11 -pthreads" { target *-*-solaris* } }
 // { dg-options " -std=gnu++11 " { target *-*-cygwin *-*-rtems* *-*-darwin* } }
 // { dg-require-cstdint "" }
-// { dg-require-gthreads-timed "" }
 
 // Copyright (C) 2008-2015 Free Software Foundation, Inc.
 //
index b7936e63e773368a6838b06a6677c90549f255f9..8bfe85b67762de24cb20364a0cdae8958741da39 100644 (file)
@@ -3,7 +3,6 @@
 // { dg-options " -std=gnu++11 -pthreads" { target *-*-solaris* } }
 // { dg-options " -std=gnu++11 " { target *-*-cygwin *-*-rtems* *-*-darwin* } }
 // { dg-require-cstdint "" }
-// { dg-require-gthreads-timed "" }
 
 // Copyright (C) 2008-2015 Free Software Foundation, Inc.
 //
index 1d21edfa2bc33327d2382ad1ced7a1b98d9e870f..082e4ef65c09bb7c5c1eea712b2beac5d9a51277 100644 (file)
@@ -3,7 +3,6 @@
 // { dg-options " -std=gnu++11 -pthreads" { target *-*-solaris* } }
 // { dg-options " -std=gnu++11 " { target *-*-cygwin *-*-rtems* *-*-darwin* } }
 // { dg-require-cstdint "" }
-// { dg-require-gthreads-timed "" }
 
 // Copyright (C) 2008-2015 Free Software Foundation, Inc.
 //
index 7766eb6b20e73844808a7d7bfaca4af8f6e27f75..029f779d0cfa37e58e55b715da92ca76aa8a5189 100644 (file)
@@ -3,7 +3,6 @@
 // { dg-options " -std=gnu++11 -pthreads" { target *-*-solaris* } }
 // { dg-options " -std=gnu++11 " { target *-*-cygwin *-*-rtems* *-*-darwin* } }
 // { dg-require-cstdint "" }
-// { dg-require-gthreads-timed "" }
 
 // Copyright (C) 2008-2015 Free Software Foundation, Inc.
 //
index f99e44233fec4190ce2731b880eb85dfa4d32d6f..5dc33165877dddd507cbead16a5775237d85aaec 100644 (file)
@@ -3,7 +3,6 @@
 // { dg-options " -std=gnu++11 -pthreads" { target *-*-solaris* } }
 // { dg-options " -std=gnu++11 " { target *-*-cygwin *-*-rtems* *-*-darwin* } }
 // { dg-require-cstdint "" }
-// { dg-require-gthreads-timed "" }
 
 // Copyright (C) 2008-2015 Free Software Foundation, Inc.
 //
index 86857b32735f763e178836a45d6fb42fc11d34dd..15f9cdf4ddca300356928619089bb0f319402b9c 100644 (file)
@@ -3,7 +3,6 @@
 // { dg-options " -std=gnu++11 -pthreads" { target *-*-solaris* } }
 // { dg-options " -std=gnu++11 " { target *-*-cygwin *-*-rtems* *-*-darwin* } }
 // { dg-require-cstdint "" }
-// { dg-require-gthreads-timed "" }
 
 // Copyright (C) 2013-2015 Free Software Foundation, Inc.
 //
index d086bceb75b8f6a755530ef8c163ef29e1af8f60..812e2d833e54e2829feba4f222dce1eb136a7b0e 100644 (file)
@@ -3,7 +3,6 @@
 // { dg-options " -std=gnu++11 -pthreads" { target *-*-solaris* } }
 // { dg-options " -std=gnu++11 " { target *-*-cygwin *-*-rtems* *-*-darwin* } }
 // { dg-require-cstdint "" }
-// { dg-require-gthreads-timed "" }
 
 // Copyright (C) 2008-2015 Free Software Foundation, Inc.
 //
index d1fdb547e788223f878f712860ecae4d8ea50937..b62af9b8d0574cdf29843f1db515af9dac784cd9 100644 (file)
@@ -3,7 +3,6 @@
 // { dg-options " -std=gnu++11 -pthreads" { target *-*-solaris* } }
 // { dg-options " -std=gnu++11 " { target *-*-cygwin *-*-rtems* *-*-darwin* } }
 // { dg-require-cstdint "" }
-// { dg-require-gthreads-timed "" }
 
 // Copyright (C) 2008-2015 Free Software Foundation, Inc.
 //
index f0c36cf9bc0d5ab28e057f7c27a2e364e3dc1195..36b1cd6beba42fad16c7a6f9d8bb7372d3a860eb 100644 (file)
@@ -3,7 +3,6 @@
 // { dg-options " -std=gnu++11 -pthreads" { target *-*-solaris* } }
 // { dg-options " -std=gnu++11 " { target *-*-cygwin *-*-rtems* *-*-darwin* } }
 // { dg-require-cstdint "" }
-// { dg-require-gthreads-timed "" }
 
 // Copyright (C) 2008-2015 Free Software Foundation, Inc.
 //
index 568de7ad483a51b9b4e154a52ee436f8615980c9..11b4fb632ac736c2918e7cf79f8406bf290947b4 100644 (file)
@@ -3,7 +3,6 @@
 // { dg-options " -std=gnu++11 -pthreads" { target *-*-solaris* } }
 // { dg-options " -std=gnu++11 " { target *-*-cygwin *-*-rtems* *-*-darwin* } }
 // { dg-require-cstdint "" }
-// { dg-require-gthreads-timed "" }
 
 // Copyright (C) 2008-2015 Free Software Foundation, Inc.
 //
index e2e3aaab6bee48c71a0ed4147d724d61b33be333..2be15bfd31afba80e3762adcfbe50c89dbdba2cc 100644 (file)
@@ -3,7 +3,6 @@
 // { dg-options " -std=gnu++11 -pthreads" { target *-*-solaris* } }
 // { dg-options " -std=gnu++11 " { target *-*-cygwin *-*-rtems* *-*-darwin* } }
 // { dg-require-cstdint "" }
-// { dg-require-gthreads-timed "" }
 
 // Copyright (C) 2008-2015 Free Software Foundation, Inc.
 //