@@ -1126,10 +1126,18 @@ TEST(TestRtsanInterceptors, PthreadJoinDiesWhenRealtime) {
1126
1126
}
1127
1127
1128
1128
#if SANITIZER_APPLE
1129
-
1130
1129
#pragma clang diagnostic push
1131
1130
// OSSpinLockLock is deprecated, but still in use in libc++
1132
1131
#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
+
1133
1141
TEST (TestRtsanInterceptors, OsSpinLockLockDiesWhenRealtime) {
1134
1142
auto Func = []() {
1135
1143
OSSpinLock spin_lock{};
@@ -1138,7 +1146,14 @@ TEST(TestRtsanInterceptors, OsSpinLockLockDiesWhenRealtime) {
1138
1146
ExpectRealtimeDeath (Func, " OSSpinLockLock" );
1139
1147
ExpectNonRealtimeSurvival (Func);
1140
1148
}
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"
1142
1157
1143
1158
TEST (TestRtsanInterceptors, OsUnfairLockLockDiesWhenRealtime) {
1144
1159
auto Func = []() {
@@ -1148,26 +1163,7 @@ TEST(TestRtsanInterceptors, OsUnfairLockLockDiesWhenRealtime) {
1148
1163
ExpectRealtimeDeath (Func, " os_unfair_lock_lock" );
1149
1164
ExpectNonRealtimeSurvival (Func);
1150
1165
}
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
1171
1167
1172
1168
#if SANITIZER_LINUX
1173
1169
TEST (TestRtsanInterceptors, SpinLockLockDiesWhenRealtime) {
0 commit comments