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