1//===-- SBMutexTest.cpp ---------------------------------------------------===//
2//
3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4// See https://llvm.org/LICENSE.txt for license information.
5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6//
7//===----------------------------------------------------------------------===//
8
9// Use the umbrella header for -Wdocumentation.
10#include "lldb/API/LLDB.h"
11
12#include "TestingSupport/SubsystemRAII.h"
13#include "lldb/API/SBDebugger.h"
14#include "lldb/API/SBTarget.h"
15#include "gtest/gtest.h"
16#include <atomic>
17#include <chrono>
18#include <future>
19#include <mutex>
20
21using namespace lldb;
22using namespace lldb_private;
23
24class SBMutexTest : public testing::Test {
25protected:
26 void SetUp() override { debugger = SBDebugger::Create(); }
27 void TearDown() override { SBDebugger::Destroy(debugger); }
28
29 SubsystemRAII<lldb::SBDebugger> subsystems;
30 SBDebugger debugger;
31};
32
33TEST_F(SBMutexTest, LockTest) {
34 lldb::SBTarget target = debugger.GetDummyTarget();
35 std::atomic<bool> locked = false;
36 std::future<void> f;
37 {
38 lldb::SBMutex lock = target.GetAPIMutex();
39 std::lock_guard<lldb::SBMutex> lock_guard(lock);
40 ASSERT_FALSE(locked.exchange(true));
41
42 f = std::async(policy: std::launch::async, fn: [&]() {
43 ASSERT_TRUE(locked);
44 target.BreakpointCreateByName(symbol_name: "foo", module_name: "bar");
45 ASSERT_FALSE(locked);
46 });
47 ASSERT_TRUE(f.valid());
48
49 // Wait 500ms to confirm the thread is blocked.
50 auto status = f.wait_for(rel: std::chrono::milliseconds(500));
51 ASSERT_EQ(status, std::future_status::timeout);
52
53 ASSERT_TRUE(locked.exchange(false));
54 }
55 f.wait();
56}
57

Provided by KDAB

Privacy Policy
Improve your Profiling and Debugging skills
Find out more

source code of lldb/unittests/API/SBMutexTest.cpp