From patchwork Fri Sep 4 10:18:19 2015 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Jonathan Wakely X-Patchwork-Id: 514371 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Received: from sourceware.org (server1.sourceware.org [209.132.180.131]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 32838140285 for ; Fri, 4 Sep 2015 20:18:35 +1000 (AEST) Authentication-Results: ozlabs.org; dkim=pass (1024-bit key; unprotected) header.d=gcc.gnu.org header.i=@gcc.gnu.org header.b=jcxthYsh; dkim-atps=neutral DomainKey-Signature: a=rsa-sha1; c=nofws; d=gcc.gnu.org; h=list-id :list-unsubscribe:list-archive:list-post:list-help:sender:date :from:to:cc:subject:message-id:mime-version:content-type; q=dns; s=default; b=U1kHLCYKI6rb5vUypI6RAkidnkEKX4v0hE8bzONK/Ont5yP/jN Tt5sdj8bvDIGdqloFByTQlPaOtdtB7uwS5zEv2eQQj4dw78dyJvivQkLF2ntiJZI H6z1M5PkPqXn51+8ZDr2zGErf5xJARJyN7UNLq6G/8NNmm6K2p/8Tubfw= DKIM-Signature: v=1; a=rsa-sha1; c=relaxed; d=gcc.gnu.org; h=list-id :list-unsubscribe:list-archive:list-post:list-help:sender:date :from:to:cc:subject:message-id:mime-version:content-type; s= default; bh=CUETTaPK3Qvgjp8B1qgOw6tYtso=; b=jcxthYshqS+hK5LMDlEb 0EyMrfvN93Uo8rIjcqjrb8vVpNidrYYs6E3KwZYFFAxJalnHm5uRgh12PLc1t60+ kD8/viUAmrOOXTnymSgnWYq3ajSrGUB04bKjEbFidI2XFajvA4wdi8ian+++WGUm McsgfKj0UscCV4dgCQULeJM= Received: (qmail 110707 invoked by alias); 4 Sep 2015 10:18:27 -0000 Mailing-List: contact gcc-patches-help@gcc.gnu.org; run by ezmlm Precedence: bulk List-Id: List-Unsubscribe: List-Archive: List-Post: List-Help: Sender: gcc-patches-owner@gcc.gnu.org Delivered-To: mailing list gcc-patches@gcc.gnu.org Received: (qmail 110661 invoked by uid 89); 4 Sep 2015 10:18:26 -0000 Authentication-Results: sourceware.org; auth=none X-Virus-Found: No X-Spam-SWARE-Status: No, score=0.0 required=5.0 tests=AWL, BAYES_50, KAM_LAZY_DOMAIN_SECURITY, RP_MATCHES_RCVD, SPF_HELO_PASS autolearn=no version=3.3.2 X-Spam-User: qpsmtpd, 2 recipients X-HELO: mx1.redhat.com Received: from mx1.redhat.com (HELO mx1.redhat.com) (209.132.183.28) by sourceware.org (qpsmtpd/0.93/v0.84-503-g423c35a) with (AES256-GCM-SHA384 encrypted) ESMTPS; Fri, 04 Sep 2015 10:18:21 +0000 Received: from int-mx11.intmail.prod.int.phx2.redhat.com (int-mx11.intmail.prod.int.phx2.redhat.com [10.5.11.24]) by mx1.redhat.com (Postfix) with ESMTPS id A0FCBC0AAB05; Fri, 4 Sep 2015 10:18:20 +0000 (UTC) Received: from localhost (ovpn-116-43.ams2.redhat.com [10.36.116.43]) by int-mx11.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id t84AIJpu010013; Fri, 4 Sep 2015 06:18:19 -0400 Date: Fri, 4 Sep 2015 11:18:19 +0100 From: Jonathan Wakely To: libstdc++@gcc.gnu.org, gcc-patches@gcc.gnu.org Cc: Torvald Riegel Subject: [patch] libstdc++/65704 portable timed_mutex and recursive_timed_mutex Message-ID: <20150904101819.GZ2631@redhat.com> MIME-Version: 1.0 Content-Disposition: inline X-Clacks-Overhead: GNU Terry Pratchett User-Agent: Mutt/1.5.23 (2014-03-12) This provides alternative implementations of std::timed_mutex and std::recursive_timed_mutex for targets that don't support the _POSIX_TIMEOUTS option (darwin and maybe HPUX). The new versions need to use std::condition_variable, which depends on std::mutex, so I have moved std::mutex, std::lock_guard, and std::unique_lock into a new header, so that can do: #include #if ! _GTHREAD_USE_MUTEX_TIMEDLOCK # include # include #endif ... #if _GTHREAD_USE_MUTEX_TIMEDLOCK // existing implementations using pthread_mutex_t #else // new implementations using std::condition_variable #endif The new smaller header has the advantage that other libstdc++ headers which only need std::mutex and the scoped locks can include . We should only include when we need timed or recursive mutexes, or std::call_once. Tested powerpc64le-linux as normal, and again with #undef _GTHREAD_USE_MUTEX_TIMEDLOCK to test the new code. commit 03a2d83efd54483a1b19d3fa499757fbd40cf8ef Author: Jonathan Wakely Date: Fri Sep 4 10:39:42 2015 +0100 Add portable timed_mutex and recursive_timed_mutex. PR libstdc++/65704 * include/Makefile.am: Add . * include/Makefile.in: Regenerate. * include/bits/mutex.h (__mutex_base, mutex, lock_guard, unique_lock): New file containing types moved from . * include/std/condition_variable: Include instead of . * include/std/mutex (__mutex_base, mutex, lock_guard, unique_lock): Move to . * 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. diff --git a/libstdc++-v3/include/Makefile.am b/libstdc++-v3/include/Makefile.am index 41fc4af..3edb914 100644 --- a/libstdc++-v3/include/Makefile.am +++ b/libstdc++-v3/include/Makefile.am @@ -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 \ diff --git a/libstdc++-v3/include/bits/mutex.h b/libstdc++-v3/include/bits/mutex.h new file mode 100644 index 0000000..43f5b0b --- /dev/null +++ b/libstdc++-v3/include/bits/mutex.h @@ -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 +// . + +/** @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 +#else + +#include +#include +#include +#include // 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 + 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 + 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 + 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 + 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 + 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 + 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 + 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 diff --git a/libstdc++-v3/include/std/condition_variable b/libstdc++-v3/include/std/condition_variable index fbed043..4714774 100644 --- a/libstdc++-v3/include/std/condition_variable +++ b/libstdc++-v3/include/std/condition_variable @@ -36,7 +36,7 @@ #else #include -#include +#include #include #include #include diff --git a/libstdc++-v3/include/std/mutex b/libstdc++-v3/include/std/mutex index fbf1740..47141d9 100644 --- a/libstdc++-v3/include/std/mutex +++ b/libstdc++-v3/include/std/mutex @@ -41,9 +41,11 @@ #include #include #include -#include -#include -#include // for std::swap +#include +#if ! _GTHREAD_USE_MUTEX_TIMEDLOCK +# include +# include +#endif #ifdef _GLIBCXX_USE_C99_STDINT_TR1 @@ -51,32 +53,12 @@ namespace std _GLIBCXX_VISIBILITY(default) { _GLIBCXX_BEGIN_NAMESPACE_VERSION + /** + * @ingroup mutexes + * @{ + */ + #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; - }; // 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,231 +289,178 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION _M_timedlock(const __gthread_time_t& __ts) { return !__gthread_recursive_mutex_timedlock(&_M_mutex, &__ts); } }; + +#else // !_GTHREAD_USE_MUTEX_TIMEDLOCK + + /// timed_mutex + class timed_mutex + { + mutex _M_mut; + condition_variable _M_cv; + bool _M_locked = false; + + public: + + timed_mutex() = default; + ~timed_mutex() { _GLIBCXX_DEBUG_ASSERT( !_M_locked ); } + + timed_mutex(const timed_mutex&) = delete; + timed_mutex& operator=(const timed_mutex&) = delete; + + void + lock() + { + unique_lock __lk(_M_mut); + _M_cv.wait(__lk, [&]{ return !_M_locked; }); + _M_locked = true; + } + + bool + try_lock() + { + lock_guard __lk(_M_mut); + if (_M_locked) + return false; + _M_locked = true; + return true; + } + + template + bool + try_lock_for(const chrono::duration<_Rep, _Period>& __rtime) + { + unique_lock __lk(_M_mut); + if (!_M_cv.wait_for(__lk, __rtime, [&]{ return !_M_locked; })) + return false; + _M_locked = true; + return true; + } + + template + bool + try_lock_until(const chrono::time_point<_Clock, _Duration>& __atime) + { + unique_lock __lk(_M_mut); + if (!_M_cv.wait_until(__lk, __atime, [&]{ return !_M_locked; })) + return false; + _M_locked = true; + return true; + } + + void + unlock() + { + lock_guard __lk(_M_mut); + _GLIBCXX_DEBUG_ASSERT( _M_locked ); + _M_locked = false; + _M_cv.notify_one(); + } + }; + + /// recursive_timed_mutex + class recursive_timed_mutex + { + mutex _M_mut; + condition_variable _M_cv; + thread::id _M_owner; + unsigned _M_count = 0; + + // 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()) { } + + // 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; } + + const recursive_timed_mutex* _M_mx; + thread::id _M_caller; + }; + + public: + + recursive_timed_mutex() = default; + ~recursive_timed_mutex() { _GLIBCXX_DEBUG_ASSERT( _M_count == 0 ); } + + recursive_timed_mutex(const recursive_timed_mutex&) = delete; + recursive_timed_mutex& operator=(const recursive_timed_mutex&) = delete; + + void + lock() + { + _Can_lock __can_lock{this}; + unique_lock __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 __lk(_M_mut); + if (!__can_lock()) + return false; + if (_M_count == -1u) + return false; + _M_owner = __id; + ++_M_count; + return true; + } + + template + bool + try_lock_for(const chrono::duration<_Rep, _Period>& __rtime) + { + _Can_lock __can_lock{this}; + unique_lock __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 + bool + try_lock_until(const chrono::time_point<_Clock, _Duration>& __atime) + { + _Can_lock __can_lock{this}; + unique_lock __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; + } + + void + unlock() + { + lock_guard __lk(_M_mut); + _GLIBCXX_DEBUG_ASSERT( _M_owner == this_thread::get_id() ); + _GLIBCXX_DEBUG_ASSERT( _M_count > 0 ); + if (--_M_count == 0) + { + _M_owner = {}; + _M_cv.notify_one(); + } + } + }; + #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 - 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 - 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 - 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 - 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 - 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 - 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 - inline void - swap(unique_lock<_Mutex>& __x, unique_lock<_Mutex>& __y) noexcept - { __x.swap(__y); } - template inline unique_lock<_Lock> __try_to_lock(_Lock& __l) diff --git a/libstdc++-v3/testsuite/30_threads/recursive_timed_mutex/cons/1.cc b/libstdc++-v3/testsuite/30_threads/recursive_timed_mutex/cons/1.cc index a3e1b34..6e4c7f5 100644 --- a/libstdc++-v3/testsuite/30_threads/recursive_timed_mutex/cons/1.cc +++ b/libstdc++-v3/testsuite/30_threads/recursive_timed_mutex/cons/1.cc @@ -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. // diff --git a/libstdc++-v3/testsuite/30_threads/recursive_timed_mutex/cons/assign_neg.cc b/libstdc++-v3/testsuite/30_threads/recursive_timed_mutex/cons/assign_neg.cc index 6e50632..62264fe 100644 --- a/libstdc++-v3/testsuite/30_threads/recursive_timed_mutex/cons/assign_neg.cc +++ b/libstdc++-v3/testsuite/30_threads/recursive_timed_mutex/cons/assign_neg.cc @@ -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. // diff --git a/libstdc++-v3/testsuite/30_threads/recursive_timed_mutex/cons/copy_neg.cc b/libstdc++-v3/testsuite/30_threads/recursive_timed_mutex/cons/copy_neg.cc index 480c1cc..4f2c3cc 100644 --- a/libstdc++-v3/testsuite/30_threads/recursive_timed_mutex/cons/copy_neg.cc +++ b/libstdc++-v3/testsuite/30_threads/recursive_timed_mutex/cons/copy_neg.cc @@ -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. // diff --git a/libstdc++-v3/testsuite/30_threads/recursive_timed_mutex/dest/destructor_locked.cc b/libstdc++-v3/testsuite/30_threads/recursive_timed_mutex/dest/destructor_locked.cc index f823667..e06caec 100644 --- a/libstdc++-v3/testsuite/30_threads/recursive_timed_mutex/dest/destructor_locked.cc +++ b/libstdc++-v3/testsuite/30_threads/recursive_timed_mutex/dest/destructor_locked.cc @@ -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. // diff --git a/libstdc++-v3/testsuite/30_threads/recursive_timed_mutex/lock/1.cc b/libstdc++-v3/testsuite/30_threads/recursive_timed_mutex/lock/1.cc index 0b5d3aa..104f0a9 100644 --- a/libstdc++-v3/testsuite/30_threads/recursive_timed_mutex/lock/1.cc +++ b/libstdc++-v3/testsuite/30_threads/recursive_timed_mutex/lock/1.cc @@ -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. // diff --git a/libstdc++-v3/testsuite/30_threads/recursive_timed_mutex/lock/2.cc b/libstdc++-v3/testsuite/30_threads/recursive_timed_mutex/lock/2.cc index c2b56ea..d4528b5 100644 --- a/libstdc++-v3/testsuite/30_threads/recursive_timed_mutex/lock/2.cc +++ b/libstdc++-v3/testsuite/30_threads/recursive_timed_mutex/lock/2.cc @@ -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. // diff --git a/libstdc++-v3/testsuite/30_threads/recursive_timed_mutex/try_lock/1.cc b/libstdc++-v3/testsuite/30_threads/recursive_timed_mutex/try_lock/1.cc index 3afc43a..f56afc8 100644 --- a/libstdc++-v3/testsuite/30_threads/recursive_timed_mutex/try_lock/1.cc +++ b/libstdc++-v3/testsuite/30_threads/recursive_timed_mutex/try_lock/1.cc @@ -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. // diff --git a/libstdc++-v3/testsuite/30_threads/recursive_timed_mutex/try_lock/2.cc b/libstdc++-v3/testsuite/30_threads/recursive_timed_mutex/try_lock/2.cc index 335fc8f..5ec212b 100644 --- a/libstdc++-v3/testsuite/30_threads/recursive_timed_mutex/try_lock/2.cc +++ b/libstdc++-v3/testsuite/30_threads/recursive_timed_mutex/try_lock/2.cc @@ -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. // diff --git a/libstdc++-v3/testsuite/30_threads/recursive_timed_mutex/try_lock_for/1.cc b/libstdc++-v3/testsuite/30_threads/recursive_timed_mutex/try_lock_for/1.cc index 043e4c2..c17525f 100644 --- a/libstdc++-v3/testsuite/30_threads/recursive_timed_mutex/try_lock_for/1.cc +++ b/libstdc++-v3/testsuite/30_threads/recursive_timed_mutex/try_lock_for/1.cc @@ -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. // diff --git a/libstdc++-v3/testsuite/30_threads/recursive_timed_mutex/try_lock_for/2.cc b/libstdc++-v3/testsuite/30_threads/recursive_timed_mutex/try_lock_for/2.cc index 8eb3e4b..e9bc371 100644 --- a/libstdc++-v3/testsuite/30_threads/recursive_timed_mutex/try_lock_for/2.cc +++ b/libstdc++-v3/testsuite/30_threads/recursive_timed_mutex/try_lock_for/2.cc @@ -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. // diff --git a/libstdc++-v3/testsuite/30_threads/recursive_timed_mutex/try_lock_for/3.cc b/libstdc++-v3/testsuite/30_threads/recursive_timed_mutex/try_lock_for/3.cc index 33bdcca..33ec4f2 100644 --- a/libstdc++-v3/testsuite/30_threads/recursive_timed_mutex/try_lock_for/3.cc +++ b/libstdc++-v3/testsuite/30_threads/recursive_timed_mutex/try_lock_for/3.cc @@ -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. // diff --git a/libstdc++-v3/testsuite/30_threads/recursive_timed_mutex/try_lock_until/1.cc b/libstdc++-v3/testsuite/30_threads/recursive_timed_mutex/try_lock_until/1.cc index 3afc43a..f56afc8 100644 --- a/libstdc++-v3/testsuite/30_threads/recursive_timed_mutex/try_lock_until/1.cc +++ b/libstdc++-v3/testsuite/30_threads/recursive_timed_mutex/try_lock_until/1.cc @@ -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. // diff --git a/libstdc++-v3/testsuite/30_threads/recursive_timed_mutex/try_lock_until/2.cc b/libstdc++-v3/testsuite/30_threads/recursive_timed_mutex/try_lock_until/2.cc index 6269da0..367134a 100644 --- a/libstdc++-v3/testsuite/30_threads/recursive_timed_mutex/try_lock_until/2.cc +++ b/libstdc++-v3/testsuite/30_threads/recursive_timed_mutex/try_lock_until/2.cc @@ -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. // diff --git a/libstdc++-v3/testsuite/30_threads/recursive_timed_mutex/unlock/1.cc b/libstdc++-v3/testsuite/30_threads/recursive_timed_mutex/unlock/1.cc index 4477fbf..44e0b15 100644 --- a/libstdc++-v3/testsuite/30_threads/recursive_timed_mutex/unlock/1.cc +++ b/libstdc++-v3/testsuite/30_threads/recursive_timed_mutex/unlock/1.cc @@ -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. // diff --git a/libstdc++-v3/testsuite/30_threads/timed_mutex/cons/1.cc b/libstdc++-v3/testsuite/30_threads/timed_mutex/cons/1.cc index 56e489b..d6664fb 100644 --- a/libstdc++-v3/testsuite/30_threads/timed_mutex/cons/1.cc +++ b/libstdc++-v3/testsuite/30_threads/timed_mutex/cons/1.cc @@ -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. // diff --git a/libstdc++-v3/testsuite/30_threads/timed_mutex/cons/assign_neg.cc b/libstdc++-v3/testsuite/30_threads/timed_mutex/cons/assign_neg.cc index d953a4c..c6ba402 100644 --- a/libstdc++-v3/testsuite/30_threads/timed_mutex/cons/assign_neg.cc +++ b/libstdc++-v3/testsuite/30_threads/timed_mutex/cons/assign_neg.cc @@ -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. // diff --git a/libstdc++-v3/testsuite/30_threads/timed_mutex/cons/copy_neg.cc b/libstdc++-v3/testsuite/30_threads/timed_mutex/cons/copy_neg.cc index 1acb231..1874b04 100644 --- a/libstdc++-v3/testsuite/30_threads/timed_mutex/cons/copy_neg.cc +++ b/libstdc++-v3/testsuite/30_threads/timed_mutex/cons/copy_neg.cc @@ -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. // diff --git a/libstdc++-v3/testsuite/30_threads/timed_mutex/dest/destructor_locked.cc b/libstdc++-v3/testsuite/30_threads/timed_mutex/dest/destructor_locked.cc index 180174c..5e7d273 100644 --- a/libstdc++-v3/testsuite/30_threads/timed_mutex/dest/destructor_locked.cc +++ b/libstdc++-v3/testsuite/30_threads/timed_mutex/dest/destructor_locked.cc @@ -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. // diff --git a/libstdc++-v3/testsuite/30_threads/timed_mutex/lock/1.cc b/libstdc++-v3/testsuite/30_threads/timed_mutex/lock/1.cc index 5eb4bdd..26d4c78 100644 --- a/libstdc++-v3/testsuite/30_threads/timed_mutex/lock/1.cc +++ b/libstdc++-v3/testsuite/30_threads/timed_mutex/lock/1.cc @@ -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. // diff --git a/libstdc++-v3/testsuite/30_threads/timed_mutex/requirements/standard_layout.cc b/libstdc++-v3/testsuite/30_threads/timed_mutex/requirements/standard_layout.cc index f94228e..e053aeb 100644 --- a/libstdc++-v3/testsuite/30_threads/timed_mutex/requirements/standard_layout.cc +++ b/libstdc++-v3/testsuite/30_threads/timed_mutex/requirements/standard_layout.cc @@ -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. // diff --git a/libstdc++-v3/testsuite/30_threads/timed_mutex/try_lock/1.cc b/libstdc++-v3/testsuite/30_threads/timed_mutex/try_lock/1.cc index 7766eb6..029f779 100644 --- a/libstdc++-v3/testsuite/30_threads/timed_mutex/try_lock/1.cc +++ b/libstdc++-v3/testsuite/30_threads/timed_mutex/try_lock/1.cc @@ -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. // diff --git a/libstdc++-v3/testsuite/30_threads/timed_mutex/try_lock/2.cc b/libstdc++-v3/testsuite/30_threads/timed_mutex/try_lock/2.cc index f99e442..5dc3316 100644 --- a/libstdc++-v3/testsuite/30_threads/timed_mutex/try_lock/2.cc +++ b/libstdc++-v3/testsuite/30_threads/timed_mutex/try_lock/2.cc @@ -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. // diff --git a/libstdc++-v3/testsuite/30_threads/timed_mutex/try_lock_for/1.cc b/libstdc++-v3/testsuite/30_threads/timed_mutex/try_lock_for/1.cc index 7af70c1..5791aa1 100644 --- a/libstdc++-v3/testsuite/30_threads/timed_mutex/try_lock_for/1.cc +++ b/libstdc++-v3/testsuite/30_threads/timed_mutex/try_lock_for/1.cc @@ -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. // diff --git a/libstdc++-v3/testsuite/30_threads/timed_mutex/try_lock_for/2.cc b/libstdc++-v3/testsuite/30_threads/timed_mutex/try_lock_for/2.cc index b7936e6..8bfe85b 100644 --- a/libstdc++-v3/testsuite/30_threads/timed_mutex/try_lock_for/2.cc +++ b/libstdc++-v3/testsuite/30_threads/timed_mutex/try_lock_for/2.cc @@ -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. // diff --git a/libstdc++-v3/testsuite/30_threads/timed_mutex/try_lock_for/3.cc b/libstdc++-v3/testsuite/30_threads/timed_mutex/try_lock_for/3.cc index 1d21edf..082e4ef 100644 --- a/libstdc++-v3/testsuite/30_threads/timed_mutex/try_lock_for/3.cc +++ b/libstdc++-v3/testsuite/30_threads/timed_mutex/try_lock_for/3.cc @@ -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. // diff --git a/libstdc++-v3/testsuite/30_threads/timed_mutex/try_lock_until/1.cc b/libstdc++-v3/testsuite/30_threads/timed_mutex/try_lock_until/1.cc index 7766eb6..029f779 100644 --- a/libstdc++-v3/testsuite/30_threads/timed_mutex/try_lock_until/1.cc +++ b/libstdc++-v3/testsuite/30_threads/timed_mutex/try_lock_until/1.cc @@ -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. // diff --git a/libstdc++-v3/testsuite/30_threads/timed_mutex/try_lock_until/2.cc b/libstdc++-v3/testsuite/30_threads/timed_mutex/try_lock_until/2.cc index f99e442..5dc3316 100644 --- a/libstdc++-v3/testsuite/30_threads/timed_mutex/try_lock_until/2.cc +++ b/libstdc++-v3/testsuite/30_threads/timed_mutex/try_lock_until/2.cc @@ -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. // diff --git a/libstdc++-v3/testsuite/30_threads/timed_mutex/try_lock_until/57641.cc b/libstdc++-v3/testsuite/30_threads/timed_mutex/try_lock_until/57641.cc index 86857b3..15f9cdf 100644 --- a/libstdc++-v3/testsuite/30_threads/timed_mutex/try_lock_until/57641.cc +++ b/libstdc++-v3/testsuite/30_threads/timed_mutex/try_lock_until/57641.cc @@ -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. // diff --git a/libstdc++-v3/testsuite/30_threads/timed_mutex/unlock/1.cc b/libstdc++-v3/testsuite/30_threads/timed_mutex/unlock/1.cc index d086bce..812e2d8 100644 --- a/libstdc++-v3/testsuite/30_threads/timed_mutex/unlock/1.cc +++ b/libstdc++-v3/testsuite/30_threads/timed_mutex/unlock/1.cc @@ -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. // diff --git a/libstdc++-v3/testsuite/30_threads/unique_lock/cons/5.cc b/libstdc++-v3/testsuite/30_threads/unique_lock/cons/5.cc index d1fdb54..b62af9b 100644 --- a/libstdc++-v3/testsuite/30_threads/unique_lock/cons/5.cc +++ b/libstdc++-v3/testsuite/30_threads/unique_lock/cons/5.cc @@ -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. // diff --git a/libstdc++-v3/testsuite/30_threads/unique_lock/cons/6.cc b/libstdc++-v3/testsuite/30_threads/unique_lock/cons/6.cc index f0c36cf..36b1cd6 100644 --- a/libstdc++-v3/testsuite/30_threads/unique_lock/cons/6.cc +++ b/libstdc++-v3/testsuite/30_threads/unique_lock/cons/6.cc @@ -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. // diff --git a/libstdc++-v3/testsuite/30_threads/unique_lock/locking/3.cc b/libstdc++-v3/testsuite/30_threads/unique_lock/locking/3.cc index 568de7ad..11b4fb6 100644 --- a/libstdc++-v3/testsuite/30_threads/unique_lock/locking/3.cc +++ b/libstdc++-v3/testsuite/30_threads/unique_lock/locking/3.cc @@ -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. // diff --git a/libstdc++-v3/testsuite/30_threads/unique_lock/locking/4.cc b/libstdc++-v3/testsuite/30_threads/unique_lock/locking/4.cc index e2e3aaa..2be15bf 100644 --- a/libstdc++-v3/testsuite/30_threads/unique_lock/locking/4.cc +++ b/libstdc++-v3/testsuite/30_threads/unique_lock/locking/4.cc @@ -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. //