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:
parent
8b5c28ecc2
commit
7b5c2de165
@ -77,6 +77,25 @@ static volatile int g_nest_level;
|
||||
* 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)
|
||||
{
|
||||
int nest_level;
|
||||
@ -131,16 +150,22 @@ static int waiter_main(int argc, char *argv[])
|
||||
(void)sigemptyset(&act.sa_mask);
|
||||
for (i = 1; i < MAX_SIGNO; i += 2)
|
||||
{
|
||||
(void)sigaddset(&act.sa_mask, i);
|
||||
if (signest_catchable(i))
|
||||
{
|
||||
(void)sigaddset(&act.sa_mask, i);
|
||||
}
|
||||
}
|
||||
|
||||
for (i = 1; i < MAX_SIGNO; i++)
|
||||
{
|
||||
ret = sigaction(i, &act, NULL);
|
||||
if (ret < 0)
|
||||
if (signest_catchable(i))
|
||||
{
|
||||
printf("waiter_main: ERROR sigaction failed\n" , errno);
|
||||
return EXIT_FAILURE;
|
||||
ret = sigaction(i, &act, NULL);
|
||||
if (ret < 0)
|
||||
{
|
||||
printf("waiter_main: WARNING sigaction failed\n" , errno);
|
||||
return EXIT_FAILURE;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@ -261,23 +286,33 @@ void signest_test(void)
|
||||
{
|
||||
for (j = 1; j < MAX_SIGNO; j += 2)
|
||||
{
|
||||
/* Odd then even */
|
||||
if (signest_catchable(j))
|
||||
{
|
||||
kill(waiterpid, j);
|
||||
odd_signals++;
|
||||
}
|
||||
|
||||
kill(waiterpid, j);
|
||||
kill(waiterpid, j+1);
|
||||
|
||||
odd_signals++;
|
||||
even_signals++;
|
||||
if (signest_catchable(j + 1))
|
||||
{
|
||||
kill(waiterpid, j + 1);
|
||||
even_signals++;
|
||||
}
|
||||
|
||||
usleep(10*1000L);
|
||||
|
||||
/* Even then odd */
|
||||
|
||||
kill(waiterpid, j+1);
|
||||
kill(waiterpid, j);
|
||||
if (signest_catchable(j + 1))
|
||||
{
|
||||
kill(waiterpid, j + 1);
|
||||
even_signals++;
|
||||
}
|
||||
|
||||
odd_signals++;
|
||||
even_signals++;
|
||||
if (signest_catchable(j))
|
||||
{
|
||||
kill(waiterpid, j);
|
||||
odd_signals++;
|
||||
}
|
||||
|
||||
usleep(10*1000L);
|
||||
}
|
||||
@ -309,11 +344,19 @@ void signest_test(void)
|
||||
/* Odd then even */
|
||||
|
||||
sched_lock();
|
||||
kill(waiterpid, j);
|
||||
kill(waiterpid, j+1);
|
||||
|
||||
odd_signals++;
|
||||
even_signals++;
|
||||
if (signest_catchable(j))
|
||||
{
|
||||
kill(waiterpid, j);
|
||||
odd_signals++;
|
||||
}
|
||||
|
||||
if (signest_catchable(j + 1))
|
||||
{
|
||||
kill(waiterpid, j + 1);
|
||||
even_signals++;
|
||||
}
|
||||
|
||||
sched_unlock();
|
||||
|
||||
usleep(10*1000L);
|
||||
@ -321,11 +364,19 @@ void signest_test(void)
|
||||
/* Even then odd */
|
||||
|
||||
sched_lock();
|
||||
kill(waiterpid, j+1);
|
||||
kill(waiterpid, j);
|
||||
|
||||
odd_signals++;
|
||||
even_signals++;
|
||||
if (signest_catchable(j + 1))
|
||||
{
|
||||
kill(waiterpid, j + 1);
|
||||
even_signals++;
|
||||
}
|
||||
|
||||
if (signest_catchable(j))
|
||||
{
|
||||
kill(waiterpid, j);
|
||||
odd_signals++;
|
||||
}
|
||||
|
||||
sched_unlock();
|
||||
|
||||
usleep(10*1000L);
|
||||
@ -355,12 +406,21 @@ void signest_test(void)
|
||||
/* Odd then even */
|
||||
|
||||
sched_lock();
|
||||
kill(waiterpid, j);
|
||||
sem_post(&g_interferer_sem);
|
||||
kill(waiterpid, j+1);
|
||||
|
||||
odd_signals++;
|
||||
even_signals++;
|
||||
if (signest_catchable(j))
|
||||
{
|
||||
kill(waiterpid, j);
|
||||
odd_signals++;
|
||||
}
|
||||
|
||||
sem_post(&g_interferer_sem);
|
||||
|
||||
if (signest_catchable(j + 1))
|
||||
{
|
||||
kill(waiterpid, j + 1);
|
||||
even_signals++;
|
||||
}
|
||||
|
||||
sched_unlock();
|
||||
|
||||
usleep(10*1000L);
|
||||
@ -368,12 +428,20 @@ void signest_test(void)
|
||||
/* Even then odd */
|
||||
|
||||
sched_lock();
|
||||
kill(waiterpid, j+1);
|
||||
sem_post(&g_interferer_sem);
|
||||
kill(waiterpid, j);
|
||||
if (signest_catchable(j + 1))
|
||||
{
|
||||
kill(waiterpid, j + 1);
|
||||
even_signals++;
|
||||
}
|
||||
|
||||
sem_post(&g_interferer_sem);
|
||||
|
||||
if (signest_catchable(j))
|
||||
{
|
||||
kill(waiterpid, j);
|
||||
odd_signals++;
|
||||
}
|
||||
|
||||
odd_signals++;
|
||||
even_signals++;
|
||||
sched_unlock();
|
||||
|
||||
usleep(10*1000L);
|
||||
|
Loading…
Reference in New Issue
Block a user