[Lldb-commits] [lldb] [lldb] Expose the Target API mutex through the SB API (PR #133295)
Jonas Devlieghere via lldb-commits
lldb-commits at lists.llvm.org
Thu Mar 27 22:19:01 PDT 2025
================
@@ -0,0 +1,59 @@
+//===-- SBMutexTest.cpp ---------------------------------------------------===//
+//
+// 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
+//
+//===----------------------------------------------------------------------===//
+
+// Use the umbrella header for -Wdocumentation.
+#include "lldb/API/LLDB.h"
+
+#include "TestingSupport/SubsystemRAII.h"
+#include "lldb/API/SBDebugger.h"
+#include "lldb/API/SBTarget.h"
+#include "gtest/gtest.h"
+#include <atomic>
+#include <chrono>
+#include <future>
+#include <mutex>
+
+using namespace lldb;
+using namespace lldb_private;
+
+class SBMutexTest : public testing::Test {
+protected:
+ void SetUp() override { debugger = SBDebugger::Create(); }
+ void TearDown() override { SBDebugger::Destroy(debugger); }
+
+ SubsystemRAII<lldb::SBDebugger> subsystems;
+ SBDebugger debugger;
+};
+
+TEST_F(SBMutexTest, LockTest) {
+ lldb::SBTarget target = debugger.GetDummyTarget();
+
+ std::future<void> f;
+ {
+ std::atomic<bool> locked = false;
+ lldb::SBMutex lock = target.GetAPIMutex();
+ std::lock_guard<lldb::SBMutex> lock_guard(lock);
+ ASSERT_FALSE(locked.exchange(true));
+
+ f = std::async(std::launch::async, [&]() {
+ {
+ ASSERT_TRUE(locked);
+ target.BreakpointCreateByName("foo", "bar");
+ ASSERT_FALSE(locked);
+ }
+ });
+ ASSERT_TRUE(f.valid());
+
+ // Wait 500ms to confirm the thread is blocked.
+ auto status = f.wait_for(std::chrono::milliseconds(500));
----------------
JDevlieghere wrote:
The difference is the thread those things are happening on. The C++ unit test is doing the blocking call on another thread, while the Python test is doing all its work on a single thread (because Python doesn't really have "real multithreading" anyway with the GIL). Also the Python test's primarily purpose is to test the Python bindings. If SBMutex did nothing, it would still pass, because we can't check from Python that the lock is being held. The test was a little more useful for SBLock, which can query if it's actually locked.
https://github.com/llvm/llvm-project/pull/133295
More information about the lldb-commits
mailing list