examples/ostest/signest.c: Attempt to make the nested signal test compatible with the suspend/resume test. Some signals cannot be caught when the suspend/resume configuration is in place.

This commit is contained in:
Gregory Nutt 2018-08-30 13:37:37 -06:00
parent 8b5c28ecc2
commit 7b5c2de165

View File

@ -77,6 +77,25 @@ static volatile int g_nest_level;
* Private Functions * Private Functions
****************************************************************************/ ****************************************************************************/
static bool signest_catchable(int signo)
{
#ifdef CONFIG_SIG_SIGSTOP_ACTION
if (signo == SIGSTOP || signo == SIGCONT)
{
return false;
}
#endif
#ifdef CONFIG_SIG_SIGKILL_ACTION
if (signo == SIGKILL)
{
return false;
}
#endif
return true;
}
static void waiter_action(int signo) static void waiter_action(int signo)
{ {
int nest_level; int nest_level;
@ -130,19 +149,25 @@ static int waiter_main(int argc, char *argv[])
(void)sigemptyset(&act.sa_mask); (void)sigemptyset(&act.sa_mask);
for (i = 1; i < MAX_SIGNO; i += 2) for (i = 1; i < MAX_SIGNO; i += 2)
{
if (signest_catchable(i))
{ {
(void)sigaddset(&act.sa_mask, i); (void)sigaddset(&act.sa_mask, i);
} }
}
for (i = 1; i < MAX_SIGNO; i++) for (i = 1; i < MAX_SIGNO; i++)
{
if (signest_catchable(i))
{ {
ret = sigaction(i, &act, NULL); ret = sigaction(i, &act, NULL);
if (ret < 0) if (ret < 0)
{ {
printf("waiter_main: ERROR sigaction failed\n" , errno); printf("waiter_main: WARNING sigaction failed\n" , errno);
return EXIT_FAILURE; return EXIT_FAILURE;
} }
} }
}
/* Now just loop until the test completes */ /* Now just loop until the test completes */
@ -261,23 +286,33 @@ void signest_test(void)
{ {
for (j = 1; j < MAX_SIGNO; j += 2) for (j = 1; j < MAX_SIGNO; j += 2)
{ {
/* Odd then even */ if (signest_catchable(j))
{
kill(waiterpid, j); kill(waiterpid, j);
kill(waiterpid, j+1);
odd_signals++; odd_signals++;
}
if (signest_catchable(j + 1))
{
kill(waiterpid, j + 1);
even_signals++; even_signals++;
}
usleep(10*1000L); usleep(10*1000L);
/* Even then odd */ /* Even then odd */
kill(waiterpid, j+1); if (signest_catchable(j + 1))
kill(waiterpid, j); {
kill(waiterpid, j + 1);
odd_signals++;
even_signals++; even_signals++;
}
if (signest_catchable(j))
{
kill(waiterpid, j);
odd_signals++;
}
usleep(10*1000L); usleep(10*1000L);
} }
@ -309,11 +344,19 @@ void signest_test(void)
/* Odd then even */ /* Odd then even */
sched_lock(); sched_lock();
kill(waiterpid, j);
kill(waiterpid, j+1);
if (signest_catchable(j))
{
kill(waiterpid, j);
odd_signals++; odd_signals++;
}
if (signest_catchable(j + 1))
{
kill(waiterpid, j + 1);
even_signals++; even_signals++;
}
sched_unlock(); sched_unlock();
usleep(10*1000L); usleep(10*1000L);
@ -321,11 +364,19 @@ void signest_test(void)
/* Even then odd */ /* Even then odd */
sched_lock(); sched_lock();
kill(waiterpid, j+1);
kill(waiterpid, j);
odd_signals++; if (signest_catchable(j + 1))
{
kill(waiterpid, j + 1);
even_signals++; even_signals++;
}
if (signest_catchable(j))
{
kill(waiterpid, j);
odd_signals++;
}
sched_unlock(); sched_unlock();
usleep(10*1000L); usleep(10*1000L);
@ -355,12 +406,21 @@ void signest_test(void)
/* Odd then even */ /* Odd then even */
sched_lock(); sched_lock();
kill(waiterpid, j);
sem_post(&g_interferer_sem);
kill(waiterpid, j+1);
if (signest_catchable(j))
{
kill(waiterpid, j);
odd_signals++; odd_signals++;
}
sem_post(&g_interferer_sem);
if (signest_catchable(j + 1))
{
kill(waiterpid, j + 1);
even_signals++; even_signals++;
}
sched_unlock(); sched_unlock();
usleep(10*1000L); usleep(10*1000L);
@ -368,12 +428,20 @@ void signest_test(void)
/* Even then odd */ /* Even then odd */
sched_lock(); sched_lock();
kill(waiterpid, j+1); if (signest_catchable(j + 1))
sem_post(&g_interferer_sem); {
kill(waiterpid, j); kill(waiterpid, j + 1);
odd_signals++;
even_signals++; even_signals++;
}
sem_post(&g_interferer_sem);
if (signest_catchable(j))
{
kill(waiterpid, j);
odd_signals++;
}
sched_unlock(); sched_unlock();
usleep(10*1000L); usleep(10*1000L);