* <__algorithm/iter_swap.h> * <__algorithm/swap_ranges.h> * <__functional/is_transparent.h> * <__memory/uses_allocator.h> * <__ranges/drop_view.h> * <__ranges/transform_view.h> * <shared_mutex> * <span> Also updates header inclusions that were affected. **NOTE:** This is a proper subset of D105932. Since the content has already been LGTM'd, I intend to merge this patch without review, pending green CI. I decided it would be better to move these changes into their own commit since the former patch has undergone further changes and will need yet another light review. In the event any of that gets rolled back (for whatever reason), the changes in this patch won't be affected. Differential Revision: https://reviews.llvm.org/D106040
66 lines
1.3 KiB
C++
66 lines
1.3 KiB
C++
//===----------------------------------------------------------------------===//
|
|
//
|
|
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
|
|
// See https://llvm.org/LICENSE.txt for license information.
|
|
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
|
|
//
|
|
//===----------------------------------------------------------------------===//
|
|
//
|
|
// UNSUPPORTED: libcpp-has-no-threads
|
|
// UNSUPPORTED: c++03, c++11
|
|
|
|
// <shared_mutex>
|
|
|
|
// template <class Mutex> class shared_lock;
|
|
|
|
// void unlock();
|
|
|
|
#include <shared_mutex>
|
|
#include <cassert>
|
|
#include <system_error>
|
|
|
|
#include "test_macros.h"
|
|
|
|
bool unlock_called = false;
|
|
|
|
struct mutex
|
|
{
|
|
void lock_shared() {}
|
|
void unlock_shared() {unlock_called = true;}
|
|
};
|
|
|
|
mutex m;
|
|
|
|
int main(int, char**)
|
|
{
|
|
std::shared_lock<mutex> lk(m);
|
|
lk.unlock();
|
|
assert(unlock_called == true);
|
|
assert(lk.owns_lock() == false);
|
|
#ifndef TEST_HAS_NO_EXCEPTIONS
|
|
try
|
|
{
|
|
lk.unlock();
|
|
assert(false);
|
|
}
|
|
catch (std::system_error& e)
|
|
{
|
|
assert(e.code().value() == EPERM);
|
|
}
|
|
#endif
|
|
lk.release();
|
|
#ifndef TEST_HAS_NO_EXCEPTIONS
|
|
try
|
|
{
|
|
lk.unlock();
|
|
assert(false);
|
|
}
|
|
catch (std::system_error& e)
|
|
{
|
|
assert(e.code().value() == EPERM);
|
|
}
|
|
#endif
|
|
|
|
return 0;
|
|
}
|