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 using namespace std::chrono; 39 mutex_type m; 40 41 // Confirm that try_lock_until acts like try_lock if the timeout has 42 // already passed. 43 44 // First test with a timeout that is definitely in the past. 45 VERIFY( m.try_lock_until( clock_type::now() - 1s ) ); 46 m.unlock(); 47 48 // Then attempt to test with a timeout that might exactly match the 49 // current time. 50 VERIFY( m.try_lock_until( clock_type::now() ) ); 51 m.unlock(); 52 } 53 catch (const std::system_error& e) 54 { 55 VERIFY( false ); 56 } 57 catch (...) 58 { 59 VERIFY( false ); 60 } 61 } 62 main()63int main() 64 { 65 test<std::chrono::system_clock>(); 66 test<std::chrono::steady_clock>(); 67 test<__gnu_test::slow_clock>(); 68 } 69