Fix t_spawnattr test for attributes handling by posix_spawn(3).

Connect it to the build.

The code assumed that SCHED_* constants form a contiguous set of
numbers, remove the assumption by using schedulers[] array in
get_different_scheduler().  This is no-op on FreeBSD, but improves
code portability.

The selection of different priority used the min/max priority range of
the current scheduler class, instead of the priority to be changed to.
The bug caused the test failure.

Remove duplication of POSIX_SPAWN_SETSIGDEF flag and now unused
duplications of MIN/MAX definitions.

Reviewed by:	jilles, pho
Sponsored by:	The FreeBSD Foundation
MFC after:	1 week
Differential Revision:	https://reviews.freebsd.org/D3533
This commit is contained in:
Konstantin Belousov 2015-09-01 12:47:11 +00:00
parent f3c7b830e5
commit 3cc31a047e
Notes: svn2git 2020-12-20 02:59:44 +00:00
svn path=/head/; revision=287360
2 changed files with 33 additions and 28 deletions

View file

@ -30,6 +30,7 @@
* POSSIBILITY OF SUCH DAMAGE.
*/
#include <sys/param.h>
#include <atf-c.h>
#include <stdio.h>
#include <stdlib.h>
@ -42,51 +43,56 @@
#include <unistd.h>
#include <sys/wait.h>
#define MAX(a, b) (a) > (b) ? (a) : (b)
#define MIN(a, b) (a) > (b) ? (b) : (a)
static int get_different_scheduler(void);
static int get_different_priority(void);
static int get_different_priority(int scheduler);
static const int schedulers[] = {
SCHED_OTHER,
SCHED_FIFO,
SCHED_RR
};
static int
get_different_scheduler()
get_different_scheduler(void)
{
int scheduler, max, min, new;
max = MAX(MAX(SCHED_FIFO, SCHED_OTHER), SCHED_RR);
min = MIN(MIN(SCHED_FIFO, SCHED_OTHER), SCHED_RR);
u_int i;
int scheduler;
/* get current schedule policy */
scheduler = sched_getscheduler(0);
for (i = 0; i < nitems(schedulers); i++) {
if (schedulers[i] == scheduler)
break;
}
ATF_REQUIRE_MSG(i < nitems(schedulers),
"Unknown current scheduler %d", scheduler);
/* new scheduler */
new = (scheduler + 1);
if (new > max)
new = min;
return new;
i++;
if (i >= nitems(schedulers))
i = 0;
return schedulers[i];
}
static int
get_different_priority()
get_different_priority(int scheduler)
{
int scheduler, max, min, new, priority;
int max, min, new, priority;
struct sched_param param;
/* get current schedule policy */
scheduler = sched_getscheduler(0);
max = sched_get_priority_max(scheduler);
min = sched_get_priority_min(scheduler);
sched_getparam(0, &param);
priority = param.sched_priority;
/* new schedule policy */
new = (priority + 1);
/*
* Change numerical value of the priority, to ensure that it
* was set for the spawned child.
*/
new = priority + 1;
if (new > max)
new = min;
return new;
}
@ -119,16 +125,15 @@ ATF_TC_BODY(t_spawnattr, tc)
posix_spawnattr_init(&attr);
scheduler = get_different_scheduler();
priority = get_different_priority();
priority = get_different_priority(scheduler);
sp.sched_priority = priority;
sigemptyset(&sig);
sigaddset(&sig, SIGUSR1);
posix_spawnattr_setflags(&attr, POSIX_SPAWN_SETSCHEDULER |
POSIX_SPAWN_SETSCHEDPARAM | POSIX_SPAWN_SETPGROUP |
POSIX_SPAWN_SETSIGMASK | POSIX_SPAWN_SETSIGDEF |
POSIX_SPAWN_SETSIGDEF);
posix_spawnattr_setflags(&attr, POSIX_SPAWN_SETSCHEDULER |
POSIX_SPAWN_SETSCHEDPARAM | POSIX_SPAWN_SETPGROUP |
POSIX_SPAWN_SETSIGMASK | POSIX_SPAWN_SETSIGDEF);
posix_spawnattr_setpgroup(&attr, 0);
posix_spawnattr_setschedparam(&attr, &sp);
posix_spawnattr_setschedpolicy(&attr, scheduler);

View file

@ -10,9 +10,9 @@ TESTSDIR= ${TESTSBASE}/lib/libc/gen/posix_spawn
BINDIR= ${TESTSDIR}
# TODO: t_spawnattr (fix from pho@ needs additional review)
NETBSD_ATF_TESTS_C= fileactions_test
NETBSD_ATF_TESTS_C+= spawn_test
NETBSD_ATF_TESTS_C+= spawnattr_test
PROGS= h_fileactions
PROGS+= h_spawn