aboutsummaryrefslogtreecommitdiff
path: root/lldb/test/API/python_api
diff options
context:
space:
mode:
authorJonas Devlieghere <jonas@devlieghere.com>2025-03-31 08:19:41 -0700
committerGitHub <noreply@github.com>2025-03-31 08:19:41 -0700
commit50949ebf523cc09cc911a12691fb79b6ac97102a (patch)
treea95a98bc5995f003b97d950f4a0082c37a0b221e /lldb/test/API/python_api
parent74b7abf15452574808834c0a08dd2af6bada2648 (diff)
downloadllvm-50949ebf523cc09cc911a12691fb79b6ac97102a.zip
llvm-50949ebf523cc09cc911a12691fb79b6ac97102a.tar.gz
llvm-50949ebf523cc09cc911a12691fb79b6ac97102a.tar.bz2
[lldb] Expose the Target API mutex through the SB API (#133295)
Expose u target API mutex through the SB API. This is motivated by lldb-dap, which is built on top of the SB API and needs a way to execute a series of SB API calls in an atomic manner (see #131242). We can solve this problem by either introducing an additional layer of locking at the DAP level or by exposing the existing locking at the SB API level. This patch implements the second approach. This was discussed in an RFC on Discourse [0]. The original implementation exposed a move-only lock rather than a mutex [1] which doesn't work well with SWIG 4.0 [2]. This implement the alternative solution of exposing the mutex rather than the lock. The SBMutex conforms to the BasicLockable requirement [3] (which is why the methods are called `lock` and `unlock` rather than Lock and Unlock) so it can be used as `std::lock_guard<lldb::SBMutex>` and `std::unique_lock<lldb::SBMutex>`. [0]: https://discourse.llvm.org/t/rfc-exposing-the-target-api-lock-through-the-sb-api/85215/6 [1]: https://github.com/llvm/llvm-project/pull/131404 [2]: https://discourse.llvm.org/t/rfc-bumping-the-minimum-swig-version-to-4-1-0/85377/9 [3]: https://en.cppreference.com/w/cpp/named_req/BasicLockable
Diffstat (limited to 'lldb/test/API/python_api')
-rw-r--r--lldb/test/API/python_api/target/TestTargetAPI.py24
1 files changed, 24 insertions, 0 deletions
diff --git a/lldb/test/API/python_api/target/TestTargetAPI.py b/lldb/test/API/python_api/target/TestTargetAPI.py
index 155a25b..67b9d19 100644
--- a/lldb/test/API/python_api/target/TestTargetAPI.py
+++ b/lldb/test/API/python_api/target/TestTargetAPI.py
@@ -537,3 +537,27 @@ class TargetAPITestCase(TestBase):
"""Make sure we don't crash when trying to select invalid target."""
target = lldb.SBTarget()
self.dbg.SetSelectedTarget(target)
+
+ @no_debug_info_test
+ def test_get_api_mutex(self):
+ """Make sure we can lock and unlock the API mutex from Python."""
+ target = self.dbg.GetDummyTarget()
+
+ mutex = target.GetAPIMutex()
+ self.assertTrue(mutex.IsValid())
+ mutex.lock()
+ # The API call below doesn't actually matter, it's just there to
+ # confirm we don't block on the API lock.
+ target.BreakpointCreateByName("foo", "bar")
+ mutex.unlock()
+
+ @no_debug_info_test
+ def test_get_api_mutex_with_statement(self):
+ """Make sure we can lock and unlock the API mutex using a with-statement from Python."""
+ target = self.dbg.GetDummyTarget()
+
+ with target.GetAPIMutex() as mutex:
+ self.assertTrue(mutex.IsValid())
+ # The API call below doesn't actually matter, it's just there to
+ # confirm we don't block on the API lock.
+ target.BreakpointCreateByName("foo", "bar")