@@ -1126,10 +1126,18 @@ TEST(TestRtsanInterceptors, PthreadJoinDiesWhenRealtime) {
11261126}
11271127
11281128#if SANITIZER_APPLE
1129-
11301129#pragma clang diagnostic push
11311130// OSSpinLockLock is deprecated, but still in use in libc++
11321131#pragma clang diagnostic ignored "-Wdeprecated-declarations"
1132+ #undef OSSpinLockLock
1133+ extern " C" {
1134+ typedef int32_t OSSpinLock;
1135+ void OSSpinLockLock (volatile OSSpinLock *__lock);
1136+ // _os_nospin_lock_lock may replace OSSpinLockLock due to deprecation macro.
1137+ typedef volatile OSSpinLock *_os_nospin_lock_t ;
1138+ void _os_nospin_lock_lock (_os_nospin_lock_t lock);
1139+ }
1140+
11331141TEST (TestRtsanInterceptors, OsSpinLockLockDiesWhenRealtime) {
11341142 auto Func = []() {
11351143 OSSpinLock spin_lock{};
@@ -1138,7 +1146,14 @@ TEST(TestRtsanInterceptors, OsSpinLockLockDiesWhenRealtime) {
11381146 ExpectRealtimeDeath (Func, " OSSpinLockLock" );
11391147 ExpectNonRealtimeSurvival (Func);
11401148}
1141- #pragma clang diagnostic pop
1149+
1150+ TEST (TestRtsanInterceptors, OsNoSpinLockLockDiesWhenRealtime) {
1151+ OSSpinLock lock{};
1152+ auto Func = [&]() { _os_nospin_lock_lock (&lock); };
1153+ ExpectRealtimeDeath (Func, " _os_nospin_lock_lock" );
1154+ ExpectNonRealtimeSurvival (Func);
1155+ }
1156+ #pragma clang diagnostic pop // "-Wdeprecated-declarations"
11421157
11431158TEST (TestRtsanInterceptors, OsUnfairLockLockDiesWhenRealtime) {
11441159 auto Func = []() {
@@ -1148,26 +1163,7 @@ TEST(TestRtsanInterceptors, OsUnfairLockLockDiesWhenRealtime) {
11481163 ExpectRealtimeDeath (Func, " os_unfair_lock_lock" );
11491164 ExpectNonRealtimeSurvival (Func);
11501165}
1151-
1152- // We intercept _os_nospin_lock_lock because it's the internal
1153- // locking mechanism for MacOS's atomic implementation for data
1154- // types that are larger than the hardware's maximum lock-free size.
1155- // However, it's a private implementation detail and not visible in any headers,
1156- // so we must duplicate the required type definitions to forward declaration
1157- // what we need here.
1158- extern " C" {
1159- struct _os_nospin_lock_s {
1160- unsigned int oul_value;
1161- };
1162- void _os_nospin_lock_lock (_os_nospin_lock_s *);
1163- }
1164- TEST (TestRtsanInterceptors, OsNoSpinLockLockDiesWhenRealtime) {
1165- _os_nospin_lock_s lock{};
1166- auto Func = [&]() { _os_nospin_lock_lock (&lock); };
1167- ExpectRealtimeDeath (Func, " _os_nospin_lock_lock" );
1168- ExpectNonRealtimeSurvival (Func);
1169- }
1170- #endif
1166+ #endif // SANITIZER_APPLE
11711167
11721168#if SANITIZER_LINUX
11731169TEST (TestRtsanInterceptors, SpinLockLockDiesWhenRealtime) {
0 commit comments