This is an automated email from the ASF dual-hosted git repository. xiaoxiang pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/nuttx-apps.git
The following commit(s) were added to refs/heads/master by this push: new 376cc5a73 testing/ostest: Add checking of signal delivery TID to signest test 376cc5a73 is described below commit 376cc5a731d9b43a34dd619fece8c49015238fd1 Author: Jukka Laitinen <jukka.laiti...@tii.ae> AuthorDate: Wed May 7 10:29:11 2025 +0300 testing/ostest: Add checking of signal delivery TID to signest test - Add another signal action, "interfere_action", and signal the interfere thread - In both signal action functions (waiter and interfere), check that they get executed in correct thread's context Signed-off-by: Jukka Laitinen <jukka.laiti...@tii.ae> --- testing/ostest/signest.c | 91 +++++++++++++++++++++++++++++++++--------------- 1 file changed, 62 insertions(+), 29 deletions(-) diff --git a/testing/ostest/signest.c b/testing/ostest/signest.c index 1e82e8ea6..5e8e65961 100644 --- a/testing/ostest/signest.c +++ b/testing/ostest/signest.c @@ -52,6 +52,8 @@ * Private Data ****************************************************************************/ +static pthread_t g_waiterpid; +static pthread_t g_interferepid; static sem_t g_waiter_sem; static sem_t g_interferer_sem; static sem_t g_sem_thread_started; @@ -90,10 +92,29 @@ static bool signest_catchable(int signo) return true; } +static void interfere_action(int signo) +{ + pthread_t pid = pthread_self(); + if (pid != g_interferepid) + { + printf("interfere_action: Delivered to wrong TID %d, expected %d\n", + pid, g_interferepid); + ASSERT(false); + } +} + static void waiter_action(int signo) { int nest_level; + pthread_t pid = pthread_self(); + if (pid != g_waiterpid) + { + printf("waiter_action: Delivered to wrong TID %d, expected %d\n", + pid, g_waiterpid); + ASSERT(false); + } + sched_lock(); nest_level = g_nest_level++; @@ -145,7 +166,7 @@ static FAR void *waiter_main(FAR void *arg) act.sa_flags = 0; sigemptyset(&act.sa_mask); - for (i = 1; i <= MAX_SIGNO; i += 2) + for (i = 1; i <= MAX_SIGNO - 1; i += 2) { if (signest_catchable(i)) { @@ -153,7 +174,7 @@ static FAR void *waiter_main(FAR void *arg) } } - for (i = 1; i <= MAX_SIGNO; i++) + for (i = 1; i <= MAX_SIGNO - 1; i++) { if (signest_catchable(i)) { @@ -167,6 +188,11 @@ static FAR void *waiter_main(FAR void *arg) } } + act.sa_handler = interfere_action; + act.sa_flags = 0; + sigemptyset(&act.sa_mask); + sigaction(MAX_SIGNO, &act, NULL); + /* Now just loop until the test completes */ printf("waiter_main: Waiting on semaphore\n"); @@ -242,8 +268,6 @@ void signest_test(void) { struct sched_param param; pthread_attr_t attr; - pid_t waiterpid; - pid_t interferepid; int total_signals; int total_handled; int total_nested; @@ -287,7 +311,7 @@ void signest_test(void) pthread_attr_init(&attr); pthread_attr_setschedparam(&attr, ¶m); pthread_attr_setstacksize(&attr, STACKSIZE); - ret = pthread_create(&waiterpid, &attr, waiter_main, NULL); + ret = pthread_create(&g_waiterpid, &attr, waiter_main, NULL); if (ret != 0) { printf("signest_test: ERROR failed to start waiter_main\n"); @@ -295,7 +319,7 @@ void signest_test(void) return; } - printf("signest_test: Started waiter_main pid=%d\n", waiterpid); + printf("signest_test: Started waiter_main pid=%d\n", g_waiterpid); /* Start interfering thread */ @@ -303,7 +327,7 @@ void signest_test(void) printf("signest_test: Starting interfering task at priority %d\n", param.sched_priority); pthread_attr_setschedparam(&attr, ¶m); - ret = pthread_create(&interferepid, &attr, interfere_main, NULL); + ret = pthread_create(&g_interferepid, &attr, interfere_main, NULL); if (ret != 0) { printf("signest_test: ERROR failed to start interfere_main\n"); @@ -311,7 +335,7 @@ void signest_test(void) goto errout_with_waiter; } - printf("signest_test: Started interfere_main pid=%d\n", interferepid); + printf("signest_test: Started interfere_main pid=%d\n", g_interferepid); /* Wait a bit */ @@ -324,37 +348,37 @@ void signest_test(void) for (i = 0; i < 10; i++) { - for (j = 1; j + 1 <= MAX_SIGNO; j += 2) + for (j = 1; j + 1 <= MAX_SIGNO - 1; j += 2) { if (signest_catchable(j)) { - pthread_kill(waiterpid, j); + pthread_kill(g_waiterpid, j); odd_signals++; } if (signest_catchable(j + 1)) { - pthread_kill(waiterpid, j + 1); + pthread_kill(g_waiterpid, j + 1); even_signals++; } - wait_finish(waiterpid, j); + wait_finish(g_waiterpid, j); /* Even then odd */ if (signest_catchable(j + 1)) { - pthread_kill(waiterpid, j + 1); + pthread_kill(g_waiterpid, j + 1); even_signals++; } if (signest_catchable(j)) { - pthread_kill(waiterpid, j); + pthread_kill(g_waiterpid, j); odd_signals++; } - wait_finish(waiterpid, j); + wait_finish(g_waiterpid, j); } } @@ -379,7 +403,7 @@ void signest_test(void) for (i = 0; i < 10; i++) { - for (j = 1; j + 1 <= MAX_SIGNO; j += 2) + for (j = 1; j + 1 <= MAX_SIGNO - 1; j += 2) { /* Odd then even */ @@ -387,19 +411,19 @@ void signest_test(void) if (signest_catchable(j)) { - pthread_kill(waiterpid, j); + pthread_kill(g_waiterpid, j); odd_signals++; } if (signest_catchable(j + 1)) { - pthread_kill(waiterpid, j + 1); + pthread_kill(g_waiterpid, j + 1); even_signals++; } sched_unlock(); - wait_finish(waiterpid, j); + wait_finish(g_waiterpid, j); /* Even then odd */ @@ -407,19 +431,19 @@ void signest_test(void) if (signest_catchable(j + 1)) { - pthread_kill(waiterpid, j + 1); + pthread_kill(g_waiterpid, j + 1); even_signals++; } if (signest_catchable(j)) { - pthread_kill(waiterpid, j); + pthread_kill(g_waiterpid, j); odd_signals++; } sched_unlock(); - wait_finish(waiterpid, j); + wait_finish(g_waiterpid, j); } } @@ -441,15 +465,17 @@ void signest_test(void) for (i = 0; i < 10; i++) { - for (j = 1; j + 1 <= MAX_SIGNO; j += 2) + for (j = 1; j + 1 <= MAX_SIGNO - 1; j += 2) { /* Odd then even */ sched_lock(); + pthread_kill(g_interferepid, MAX_SIGNO); + if (signest_catchable(j)) { - pthread_kill(waiterpid, j); + pthread_kill(g_waiterpid, j); odd_signals++; } @@ -457,20 +483,20 @@ void signest_test(void) if (signest_catchable(j + 1)) { - pthread_kill(waiterpid, j + 1); + pthread_kill(g_waiterpid, j + 1); even_signals++; } sched_unlock(); - wait_finish(waiterpid, j); + wait_finish(g_waiterpid, j); /* Even then odd */ sched_lock(); if (signest_catchable(j + 1)) { - pthread_kill(waiterpid, j + 1); + pthread_kill(g_waiterpid, j + 1); even_signals++; } @@ -478,13 +504,13 @@ void signest_test(void) if (signest_catchable(j)) { - pthread_kill(waiterpid, j); + pthread_kill(g_waiterpid, j); odd_signals++; } sched_unlock(); - wait_finish(waiterpid, j); + wait_finish(g_waiterpid, j); } } @@ -556,6 +582,13 @@ errout_with_waiter: ASSERT(false); } + /* Unregister signal handlers */ + + for (i = 1; i <= MAX_SIGNO; i++) + { + signal(i, SIG_DFL); + } + sem_destroy(&g_waiter_sem); sem_destroy(&g_interferer_sem); sem_destroy(&g_sem_thread_started);