@@ -1036,10 +1036,18 @@ TEST(TestRtsanInterceptors, PthreadJoinDiesWhenRealtime) {
10361036}
10371037
10381038#if SANITIZER_APPLE
1039-
10401039#pragma clang diagnostic push
10411040// OSSpinLockLock is deprecated, but still in use in libc++
10421041#pragma clang diagnostic ignored "-Wdeprecated-declarations"
1042+ #undef OSSpinLockLock
1043+ extern " C" {
1044+ typedef int32_t OSSpinLock;
1045+ void OSSpinLockLock (volatile OSSpinLock *__lock);
1046+ // _os_nospin_lock_lock may replace OSSpinLockLock due to deprecation macro.
1047+ typedef volatile OSSpinLock *_os_nospin_lock_t ;
1048+ void _os_nospin_lock_lock (_os_nospin_lock_t lock);
1049+ }
1050+
10431051TEST (TestRtsanInterceptors, OsSpinLockLockDiesWhenRealtime) {
10441052 auto Func = []() {
10451053 OSSpinLock spin_lock{};
@@ -1048,7 +1056,14 @@ TEST(TestRtsanInterceptors, OsSpinLockLockDiesWhenRealtime) {
10481056 ExpectRealtimeDeath (Func, " OSSpinLockLock" );
10491057 ExpectNonRealtimeSurvival (Func);
10501058}
1051- #pragma clang diagnostic pop
1059+
1060+ TEST (TestRtsanInterceptors, OsNoSpinLockLockDiesWhenRealtime) {
1061+ OSSpinLock lock{};
1062+ auto Func = [&]() { _os_nospin_lock_lock (&lock); };
1063+ ExpectRealtimeDeath (Func, " _os_nospin_lock_lock" );
1064+ ExpectNonRealtimeSurvival (Func);
1065+ }
1066+ #pragma clang diagnostic pop // "-Wdeprecated-declarations"
10521067
10531068TEST (TestRtsanInterceptors, OsUnfairLockLockDiesWhenRealtime) {
10541069 auto Func = []() {
@@ -1058,26 +1073,7 @@ TEST(TestRtsanInterceptors, OsUnfairLockLockDiesWhenRealtime) {
10581073 ExpectRealtimeDeath (Func, " os_unfair_lock_lock" );
10591074 ExpectNonRealtimeSurvival (Func);
10601075}
1061-
1062- // We intercept _os_nospin_lock_lock because it's the internal
1063- // locking mechanism for MacOS's atomic implementation for data
1064- // types that are larger than the hardware's maximum lock-free size.
1065- // However, it's a private implementation detail and not visible in any headers,
1066- // so we must duplicate the required type definitions to forward declaration
1067- // what we need here.
1068- extern " C" {
1069- struct _os_nospin_lock_s {
1070- unsigned int oul_value;
1071- };
1072- void _os_nospin_lock_lock (_os_nospin_lock_s *);
1073- }
1074- TEST (TestRtsanInterceptors, OsNoSpinLockLockDiesWhenRealtime) {
1075- _os_nospin_lock_s lock{};
1076- auto Func = [&]() { _os_nospin_lock_lock (&lock); };
1077- ExpectRealtimeDeath (Func, " _os_nospin_lock_lock" );
1078- ExpectNonRealtimeSurvival (Func);
1079- }
1080- #endif
1076+ #endif // SANITIZER_APPLE
10811077
10821078#if SANITIZER_LINUX
10831079TEST (TestRtsanInterceptors, SpinLockLockDiesWhenRealtime) {
0 commit comments