1ba898e42081aec544a04d282834aa99b13d57803Howard Hinnant//===----------------------------------------------------------------------===//
2ba898e42081aec544a04d282834aa99b13d57803Howard Hinnant//
3ba898e42081aec544a04d282834aa99b13d57803Howard Hinnant//                     The LLVM Compiler Infrastructure
4ba898e42081aec544a04d282834aa99b13d57803Howard Hinnant//
5ba898e42081aec544a04d282834aa99b13d57803Howard Hinnant// This file is dual licensed under the MIT and the University of Illinois Open
6ba898e42081aec544a04d282834aa99b13d57803Howard Hinnant// Source Licenses. See LICENSE.TXT for details.
7ba898e42081aec544a04d282834aa99b13d57803Howard Hinnant//
8ba898e42081aec544a04d282834aa99b13d57803Howard Hinnant//===----------------------------------------------------------------------===//
9ba898e42081aec544a04d282834aa99b13d57803Howard Hinnant
10ba898e42081aec544a04d282834aa99b13d57803Howard Hinnant// <shared_mutex>
11ba898e42081aec544a04d282834aa99b13d57803Howard Hinnant
12ba898e42081aec544a04d282834aa99b13d57803Howard Hinnant// template <class Mutex> class shared_lock;
13ba898e42081aec544a04d282834aa99b13d57803Howard Hinnant
14ba898e42081aec544a04d282834aa99b13d57803Howard Hinnant// mutex_type* release() noexcept;
15ba898e42081aec544a04d282834aa99b13d57803Howard Hinnant
16ba898e42081aec544a04d282834aa99b13d57803Howard Hinnant#include <shared_mutex>
17ba898e42081aec544a04d282834aa99b13d57803Howard Hinnant#include <cassert>
18ba898e42081aec544a04d282834aa99b13d57803Howard Hinnant
19ba898e42081aec544a04d282834aa99b13d57803Howard Hinnant#if _LIBCPP_STD_VER > 11
20ba898e42081aec544a04d282834aa99b13d57803Howard Hinnant
21ba898e42081aec544a04d282834aa99b13d57803Howard Hinnantstruct mutex
22ba898e42081aec544a04d282834aa99b13d57803Howard Hinnant{
23ba898e42081aec544a04d282834aa99b13d57803Howard Hinnant    static int lock_count;
24ba898e42081aec544a04d282834aa99b13d57803Howard Hinnant    static int unlock_count;
25ba898e42081aec544a04d282834aa99b13d57803Howard Hinnant    void lock_shared() {++lock_count;}
26ba898e42081aec544a04d282834aa99b13d57803Howard Hinnant    void unlock_shared() {++unlock_count;}
27ba898e42081aec544a04d282834aa99b13d57803Howard Hinnant};
28ba898e42081aec544a04d282834aa99b13d57803Howard Hinnant
29ba898e42081aec544a04d282834aa99b13d57803Howard Hinnantint mutex::lock_count = 0;
30ba898e42081aec544a04d282834aa99b13d57803Howard Hinnantint mutex::unlock_count = 0;
31ba898e42081aec544a04d282834aa99b13d57803Howard Hinnant
32ba898e42081aec544a04d282834aa99b13d57803Howard Hinnantmutex m;
33ba898e42081aec544a04d282834aa99b13d57803Howard Hinnant
34ba898e42081aec544a04d282834aa99b13d57803Howard Hinnant#endif  // _LIBCPP_STD_VER > 11
35ba898e42081aec544a04d282834aa99b13d57803Howard Hinnant
36ba898e42081aec544a04d282834aa99b13d57803Howard Hinnantint main()
37ba898e42081aec544a04d282834aa99b13d57803Howard Hinnant{
38ba898e42081aec544a04d282834aa99b13d57803Howard Hinnant#if _LIBCPP_STD_VER > 11
39ba898e42081aec544a04d282834aa99b13d57803Howard Hinnant    std::shared_lock<mutex> lk(m);
40ba898e42081aec544a04d282834aa99b13d57803Howard Hinnant    assert(lk.mutex() == &m);
41ba898e42081aec544a04d282834aa99b13d57803Howard Hinnant    assert(lk.owns_lock() == true);
42ba898e42081aec544a04d282834aa99b13d57803Howard Hinnant    assert(mutex::lock_count == 1);
43ba898e42081aec544a04d282834aa99b13d57803Howard Hinnant    assert(mutex::unlock_count == 0);
44ba898e42081aec544a04d282834aa99b13d57803Howard Hinnant    assert(lk.release() == &m);
45ba898e42081aec544a04d282834aa99b13d57803Howard Hinnant    assert(lk.mutex() == nullptr);
46ba898e42081aec544a04d282834aa99b13d57803Howard Hinnant    assert(lk.owns_lock() == false);
47ba898e42081aec544a04d282834aa99b13d57803Howard Hinnant    assert(mutex::lock_count == 1);
48ba898e42081aec544a04d282834aa99b13d57803Howard Hinnant    assert(mutex::unlock_count == 0);
49ba898e42081aec544a04d282834aa99b13d57803Howard Hinnant    static_assert(noexcept(lk.release()), "release must be noexcept");
50ba898e42081aec544a04d282834aa99b13d57803Howard Hinnant#endif  // _LIBCPP_STD_VER > 11
51ba898e42081aec544a04d282834aa99b13d57803Howard Hinnant}
52