git: 4c6ceca9cc44 - main - tests/fdgrowtable: perform the threaded test in a child process
- Go to: [ bottom of page ] [ top of archives ] [ this month ]
Date: Sat, 24 Feb 2024 01:54:07 UTC
The branch main has been updated by glebius:
URL: https://cgit.FreeBSD.org/src/commit/?id=4c6ceca9cc44fc9b02dc39e80713f2ad3ab8eeb6
commit 4c6ceca9cc44fc9b02dc39e80713f2ad3ab8eeb6
Author: Gleb Smirnoff <glebius@FreeBSD.org>
AuthorDate: 2024-02-24 01:49:53 +0000
Commit: Gleb Smirnoff <glebius@FreeBSD.org>
CommitDate: 2024-02-24 01:49:53 +0000
tests/fdgrowtable: perform the threaded test in a child process
The test needs to be performed in a new process that was forked with
RFCFDG flag. The will guarantee that the table will start to grow from 20
file descriptors, no matter what kyua(1) or a bare shell was doing before
executing this test. This should fix repetitive test runs from a shell
as well as failures with kyua(1) in some environments.
---
tests/sys/kern/fdgrowtable_test.c | 34 ++++++++++++++++++++++++++++------
1 file changed, 28 insertions(+), 6 deletions(-)
diff --git a/tests/sys/kern/fdgrowtable_test.c b/tests/sys/kern/fdgrowtable_test.c
index 826599ecf836..ecab72ff09aa 100644
--- a/tests/sys/kern/fdgrowtable_test.c
+++ b/tests/sys/kern/fdgrowtable_test.c
@@ -167,21 +167,43 @@ ATF_TC_HEAD(oldtables_shared_via_threads, tc)
ATF_TC_BODY(oldtables_shared_via_threads, tc)
{
+ pid_t child;
kvm_t *kd;
struct kinfo_proc *kp;
pthread_t thread;
- ATF_REQUIRE((kd = kvm_open(NULL, NULL, NULL, O_RDONLY, NULL)) != NULL);
- ATF_REQUIRE(pthread_create(&thread, NULL, exec_thread, NULL) == 0);
+ if ((child = rfork(RFPROC | RFCFDG)) > 0) {
+ pid_t wpid;
+ int status;
+
+ wpid = waitpid(child, &status, 0);
+ ATF_REQUIRE(wpid == child);
+ ATF_REQUIRE(WIFEXITED(status));
+ ATF_REQUIRE(WEXITSTATUS(status) == EXIT_SUCCESS);
+ return;
+ }
+
+#define REQUIRE(expression) do { \
+ if (!(expression)) \
+ exit(EXIT_FAILURE); \
+ } while (0)
+
+ REQUIRE(child == 0);
+
+ REQUIRE((kd = kvm_open(NULL, NULL, NULL, O_RDONLY, NULL)) != NULL);
+ REQUIRE(pthread_create(&thread, NULL, exec_thread, NULL) == 0);
openfiles(128);
kp = read_kinfo(kd);
- ATF_CHECK(kp->ki_numthreads > 1);
- ATF_CHECK(old_tables(kd,kp) > 1);
+ REQUIRE(kp->ki_numthreads > 1);
+ REQUIRE(old_tables(kd,kp) > 1);
+
+ REQUIRE(pthread_cancel(thread) == 0);
+ REQUIRE(pthread_join(thread, NULL) == 0);
+#undef REQUIRE
- ATF_REQUIRE(pthread_cancel(thread) == 0);
- ATF_REQUIRE(pthread_join(thread, NULL) == 0);
+ exit(EXIT_SUCCESS);
}
/*