Paul Kirth e9d5842ac7
[libc++] Make std::unique_lock available with _LIBCPP_HAS_NO_THREADS (#99562)
This is a follow up to https://github.com/llvm/llvm-project/pull/98717,
which made lock_guard available under _LIBCPP_HAS_NO_THREADS. We can
make unique_lock available under similar circumstances. This patch
follows the example in #98717, by:

  - Removing the preprocessor guards for _LIBCPP_HAS_NO_THREADS in the
    unique_lock header.
  - providing a set of custom mutex implementations in a local header.
  - using custom locks in tests that can be made to work under
    `no-threads`.
2024-07-31 08:15:55 -07:00

40 lines
1.0 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
//
//===----------------------------------------------------------------------===//
// <mutex>
// template <class Mutex> class unique_lock;
// mutex_type* release() noexcept;
#include <cassert>
#include <mutex>
#include "test_macros.h"
#include "../types.h"
int MyCountingMutex::lock_count = 0;
int MyCountingMutex::unlock_count = 0;
MyCountingMutex m;
int main(int, char**) {
std::unique_lock<MyCountingMutex> lk(m);
assert(lk.mutex() == &m);
assert(lk.owns_lock() == true);
assert(MyCountingMutex::lock_count == 1);
assert(MyCountingMutex::unlock_count == 0);
assert(lk.release() == &m);
assert(lk.mutex() == nullptr);
assert(lk.owns_lock() == false);
assert(MyCountingMutex::lock_count == 1);
assert(MyCountingMutex::unlock_count == 0);
return 0;
}