In order to avoid stranding the Objective-C runtime lock, we switched from objc_copyRealizedClassList to its non locking variant objc_copyRealizedClassList_nolock. Not taking the lock was relatively safe because we run this expression on one thread only, but it was still possible that someone was in the middle of modifying this list while we were trying to read it. Worst case that would result in a crash in the inferior without side-effects and we'd unwind and try again later. With the introduction of macOS Ventura, we can use objc_getRealizedClassList_trylock instead. It has semantics similar to objc_copyRealizedClassList_nolock, but instead of not locking at all, the function returns if the lock is already taken, which avoids the aforementioned crash without stranding the Objective-C runtime lock. Because LLDB gets to allocate the underlying memory we also avoid stranding the malloc lock. rdar://89373233 Differential revision: https://reviews.llvm.org/D127252
31 lines
1.0 KiB
Python
31 lines
1.0 KiB
Python
import lldb
|
|
from lldbsuite.test.decorators import *
|
|
from lldbsuite.test.lldbtest import *
|
|
from lldbsuite.test import lldbutil
|
|
|
|
class TestCase(TestBase):
|
|
|
|
mydir = TestBase.compute_mydir(__file__)
|
|
|
|
@skipUnlessDarwin
|
|
# LLDB ends up calling the user-defined function (but at least doesn't
|
|
# crash).
|
|
@skipIf(macos_version=["<", "13.0"])
|
|
def test(self):
|
|
"""
|
|
Tests LLDB's behaviour if the user defines their own conflicting
|
|
objc_copyRealizedClassList_nolock function.
|
|
"""
|
|
|
|
self.build()
|
|
lldbutil.run_to_source_breakpoint(self, "// break here", lldb.SBFileSpec("main.m"))
|
|
|
|
# Get the (dynamic) type of our 'id' variable so that our Objective-C
|
|
# runtime information is updated.
|
|
str_val = self.expect_expr("custom_class")
|
|
dyn_val = str_val.GetDynamicValue(lldb.eDynamicCanRunTarget)
|
|
|
|
# We should have retrieved the proper class list even in presence of
|
|
# the user-defined function.
|
|
self.assertEqual(dyn_val.GetTypeName(), "CustomClass *")
|