@@ -1036,10 +1036,18 @@ TEST(TestRtsanInterceptors, PthreadJoinDiesWhenRealtime) {
1036
1036
}
1037
1037
1038
1038
#if SANITIZER_APPLE
1039
-
1040
1039
#pragma clang diagnostic push
1041
1040
// OSSpinLockLock is deprecated, but still in use in libc++
1042
1041
#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
+
1043
1051
TEST (TestRtsanInterceptors, OsSpinLockLockDiesWhenRealtime) {
1044
1052
auto Func = []() {
1045
1053
OSSpinLock spin_lock{};
@@ -1048,7 +1056,14 @@ TEST(TestRtsanInterceptors, OsSpinLockLockDiesWhenRealtime) {
1048
1056
ExpectRealtimeDeath (Func, " OSSpinLockLock" );
1049
1057
ExpectNonRealtimeSurvival (Func);
1050
1058
}
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"
1052
1067
1053
1068
TEST (TestRtsanInterceptors, OsUnfairLockLockDiesWhenRealtime) {
1054
1069
auto Func = []() {
@@ -1058,26 +1073,7 @@ TEST(TestRtsanInterceptors, OsUnfairLockLockDiesWhenRealtime) {
1058
1073
ExpectRealtimeDeath (Func, " os_unfair_lock_lock" );
1059
1074
ExpectNonRealtimeSurvival (Func);
1060
1075
}
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
1081
1077
1082
1078
#if SANITIZER_LINUX
1083
1079
TEST (TestRtsanInterceptors, SpinLockLockDiesWhenRealtime) {
0 commit comments