1 // { dg-do run } 2 // { dg-options "-pthread" } 3 // { dg-require-effective-target c++14 } 4 // { dg-require-effective-target pthread } 5 // { dg-require-gthreads "" } 6 7 // Copyright (C) 2019-2020 Free Software Foundation, Inc. 8 // 9 // This file is part of the GNU ISO C++ Library. This library is free 10 // software; you can redistribute it and/or modify it under the 11 // terms of the GNU General Public License as published by the 12 // Free Software Foundation; either version 3, or (at your option) 13 // any later version. 14 15 // This library is distributed in the hope that it will be useful, 16 // but WITHOUT ANY WARRANTY; without even the implied warranty of 17 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 18 // GNU General Public License for more details. 19 20 // You should have received a copy of the GNU General Public License along 21 // with this library; see the file COPYING3. If not see 22 // <http://www.gnu.org/licenses/>. 23 24 25 #include <mutex> 26 #include <thread> 27 #include <system_error> 28 #include <testsuite_hooks.h> 29 #include <slow_clock.h> 30 31 template <typename clock_type> test()32void test() 33 { 34 typedef std::timed_mutex mutex_type; 35 36 try 37 { 38 mutex_type m; 39 m.lock(); 40 bool b; 41 42 std::thread t([&] { 43 try 44 { 45 using namespace std::chrono; 46 const auto timeout = 100ms; 47 const auto start = clock_type::now(); 48 const auto b = m.try_lock_until(start + timeout); 49 const auto t = clock_type::now() - start; 50 VERIFY( !b ); 51 VERIFY( t >= timeout ); 52 } 53 catch (const std::system_error& e) 54 { 55 VERIFY( false ); 56 } 57 }); 58 t.join(); 59 m.unlock(); 60 } 61 catch (const std::system_error& e) 62 { 63 VERIFY( false ); 64 } 65 catch (...) 66 { 67 VERIFY( false ); 68 } 69 } 70 main()71int main() 72 { 73 test<std::chrono::system_clock>(); 74 test<std::chrono::steady_clock>(); 75 test<__gnu_test::slow_clock>(); 76 } 77