[compiler-rt] [rtsan] Add sched_yield interceptor (PR #117084)
Chris Apple via llvm-commits
llvm-commits at lists.llvm.org
Wed Nov 20 16:32:06 PST 2024
https://github.com/cjappl created https://github.com/llvm/llvm-project/pull/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.
>From c200639aa3feed5871cbce8a195dd747da3c51eb Mon Sep 17 00:00:00 2001
From: Chris Apple <cja-private at pm.me>
Date: Wed, 20 Nov 2024 16:30:25 -0800
Subject: [PATCH] [rtsan] Add sched_yield interceptor
---
compiler-rt/lib/rtsan/rtsan_interceptors_posix.cpp | 6 ++++++
compiler-rt/lib/rtsan/tests/rtsan_test_functional.cpp | 6 ++++++
.../lib/rtsan/tests/rtsan_test_interceptors_posix.cpp | 6 ++++++
3 files changed, 18 insertions(+)
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