[compiler-rt] 963b8e3 - [rtsan] Add sched_yield interceptor (#117084)
via llvm-commits
llvm-commits at lists.llvm.org
Thu Nov 21 06:30:49 PST 2024
Author: Chris Apple
Date: 2024-11-21T06:30:45-08:00
New Revision: 963b8e36bb3443ab858b83b65ec9c9723b263bd0
URL: https://github.com/llvm/llvm-project/commit/963b8e36bb3443ab858b83b65ec9c9723b263bd0
DIFF: https://github.com/llvm/llvm-project/commit/963b8e36bb3443ab858b83b65ec9c9723b263bd0.diff
LOG: [rtsan] Add sched_yield interceptor (#117084)
This calls the system calls switch_pri and sys_ulock_wait. It also is
one of the more straightforwardly rt-unsafe, in that it gives up this
thread's timeslice.
Added:
Modified:
compiler-rt/lib/rtsan/rtsan_interceptors_posix.cpp
compiler-rt/lib/rtsan/tests/rtsan_test_functional.cpp
compiler-rt/lib/rtsan/tests/rtsan_test_interceptors_posix.cpp
Removed:
################################################################################
diff --git a/compiler-rt/lib/rtsan/rtsan_interceptors_posix.cpp b/compiler-rt/lib/rtsan/rtsan_interceptors_posix.cpp
index 73448cfc117884..91d023e858ba3b 100644
--- a/compiler-rt/lib/rtsan/rtsan_interceptors_posix.cpp
+++ b/compiler-rt/lib/rtsan/rtsan_interceptors_posix.cpp
@@ -439,6 +439,11 @@ INTERCEPTOR(int, nanosleep, const struct timespec *rqtp,
return REAL(nanosleep)(rqtp, rmtp);
}
+INTERCEPTOR(int, sched_yield, void) {
+ __rtsan_notify_intercepted_call("sched_yield");
+ return REAL(sched_yield)();
+}
+
// Memory
INTERCEPTOR(void *, calloc, SIZE_T num, SIZE_T size) {
@@ -819,6 +824,7 @@ void __rtsan::InitializeInterceptors() {
INTERCEPT_FUNCTION(sleep);
INTERCEPT_FUNCTION(usleep);
INTERCEPT_FUNCTION(nanosleep);
+ INTERCEPT_FUNCTION(sched_yield);
INTERCEPT_FUNCTION(accept);
INTERCEPT_FUNCTION(bind);
diff --git a/compiler-rt/lib/rtsan/tests/rtsan_test_functional.cpp b/compiler-rt/lib/rtsan/tests/rtsan_test_functional.cpp
index ed9ee4ded7b059..ef11b71f167e1b 100644
--- a/compiler-rt/lib/rtsan/tests/rtsan_test_functional.cpp
+++ b/compiler-rt/lib/rtsan/tests/rtsan_test_functional.cpp
@@ -65,6 +65,12 @@ TEST(TestRtsan, SleepingAThreadDiesWhenRealtime) {
ExpectNonRealtimeSurvival(Func);
}
+TEST(TestRtsan, YieldingDiesWhenRealtime) {
+ auto Func = []() { std::this_thread::yield(); };
+ ExpectRealtimeDeath(Func);
+ ExpectNonRealtimeSurvival(Func);
+}
+
TEST(TestRtsan, IfstreamCreationDiesWhenRealtime) {
auto Func = []() { std::ifstream ifs{"./file.txt"}; };
ExpectRealtimeDeath(Func);
diff --git a/compiler-rt/lib/rtsan/tests/rtsan_test_interceptors_posix.cpp b/compiler-rt/lib/rtsan/tests/rtsan_test_interceptors_posix.cpp
index 3e14346f33c7ca..bf6a3a895bd3d4 100644
--- a/compiler-rt/lib/rtsan/tests/rtsan_test_interceptors_posix.cpp
+++ b/compiler-rt/lib/rtsan/tests/rtsan_test_interceptors_posix.cpp
@@ -236,6 +236,12 @@ TEST(TestRtsanInterceptors, NanosleepDiesWhenRealtime) {
ExpectNonRealtimeSurvival(Func);
}
+TEST(TestRtsanInterceptors, SchedYieldDiesWhenRealtime) {
+ auto Func = []() { sched_yield(); };
+ ExpectRealtimeDeath(Func, "sched_yield");
+ ExpectNonRealtimeSurvival(Func);
+}
+
/*
Filesystem
*/
More information about the llvm-commits
mailing list