15a83710eSEric Fiselier //===----------------------------------------------------------------------===//
25a83710eSEric Fiselier //
357b08b09SChandler Carruth // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
457b08b09SChandler Carruth // See https://llvm.org/LICENSE.txt for license information.
557b08b09SChandler Carruth // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
65a83710eSEric Fiselier //
75a83710eSEric Fiselier //===----------------------------------------------------------------------===//
85a83710eSEric Fiselier //
9*a7f9895cSLouis Dionne // UNSUPPORTED: no-threads
1031cbe0f2SLouis Dionne // UNSUPPORTED: c++03, c++11
115a83710eSEric Fiselier 
12f17eb4ecSLouis Dionne // shared_timed_mutex was introduced in macosx10.12
13c360553cSLouis Dionne // UNSUPPORTED: use_system_cxx_lib && target={{.+}}-apple-macosx10.{{9|10|11}}
14f17eb4ecSLouis Dionne 
151e1e97a3SNikolas Klauser // ALLOW_RETRIES: 3
161e1e97a3SNikolas Klauser 
175a83710eSEric Fiselier // <shared_mutex>
185a83710eSEric Fiselier 
195a83710eSEric Fiselier // class shared_timed_mutex;
205a83710eSEric Fiselier 
215a83710eSEric Fiselier // void lock();
225a83710eSEric Fiselier 
235a83710eSEric Fiselier #include <thread>
24332da1c2SChristopher Di Bella 
25332da1c2SChristopher Di Bella #include <atomic>
265a83710eSEric Fiselier #include <cstdlib>
275a83710eSEric Fiselier #include <cassert>
28332da1c2SChristopher Di Bella #include <shared_mutex>
295a83710eSEric Fiselier 
3056462801SLouis Dionne #include "make_test_thread.h"
31fb65a3a6SEric Fiselier #include "test_macros.h"
32fb65a3a6SEric Fiselier 
335a83710eSEric Fiselier std::shared_timed_mutex m;
345a83710eSEric Fiselier 
355a83710eSEric Fiselier typedef std::chrono::system_clock Clock;
365a83710eSEric Fiselier typedef Clock::time_point time_point;
375a83710eSEric Fiselier typedef Clock::duration duration;
385a83710eSEric Fiselier typedef std::chrono::milliseconds ms;
395a83710eSEric Fiselier typedef std::chrono::nanoseconds ns;
405a83710eSEric Fiselier 
414f4ce139SDavid Zarzycki std::atomic<bool> ready(false);
424f4ce139SDavid Zarzycki time_point start;
43fb65a3a6SEric Fiselier 
44fb65a3a6SEric Fiselier ms WaitTime = ms(250);
45fb65a3a6SEric Fiselier 
f()465a83710eSEric Fiselier void f()
475a83710eSEric Fiselier {
484f4ce139SDavid Zarzycki   ready.store(true);
495a83710eSEric Fiselier   m.lock();
504f4ce139SDavid Zarzycki   time_point t0 = start;
515a83710eSEric Fiselier   time_point t1 = Clock::now();
525a83710eSEric Fiselier   m.unlock();
534f4ce139SDavid Zarzycki   assert(t0.time_since_epoch() > ms(0));
544f4ce139SDavid Zarzycki   assert(t1 - t0 >= WaitTime);
555a83710eSEric Fiselier }
565a83710eSEric Fiselier 
main(int,char **)572df59c50SJF Bastien int main(int, char**)
585a83710eSEric Fiselier {
595a83710eSEric Fiselier   m.lock();
6056462801SLouis Dionne   std::thread t = support::make_test_thread(f);
614f4ce139SDavid Zarzycki   while (!ready)
624f4ce139SDavid Zarzycki     std::this_thread::yield();
634f4ce139SDavid Zarzycki   start = Clock::now();
644f4ce139SDavid Zarzycki   std::this_thread::sleep_for(WaitTime);
655a83710eSEric Fiselier   m.unlock();
665a83710eSEric Fiselier   t.join();
672df59c50SJF Bastien 
682df59c50SJF Bastien   return 0;
695a83710eSEric Fiselier }
70