mirror of
https://github.com/torvalds/linux.git
synced 2026-06-04 20:46:48 +02:00
selftests/timers/posix-timers: Validate SIGEV_NONE
Posix timers with a delivery mode of SIGEV_NONE deliver no signals but the remaining expiry time must be readable via timer_gettime() for both one shot and interval timers. That's implemented correctly for regular posix timers but broken for posix CPU timers. Add a self test so the fixes can be verified. Signed-off-by: Thomas Gleixner <tglx@linutronix.de> Signed-off-by: Frederic Weisbecker <frederic@kernel.org>
This commit is contained in:
parent
e65bb03e44
commit
2c2b56132b
|
|
@ -11,6 +11,7 @@
|
|||
#include <sys/types.h>
|
||||
#include <stdio.h>
|
||||
#include <signal.h>
|
||||
#include <stdint.h>
|
||||
#include <string.h>
|
||||
#include <unistd.h>
|
||||
#include <time.h>
|
||||
|
|
@ -20,6 +21,7 @@
|
|||
|
||||
#define DELAY 2
|
||||
#define USECS_PER_SEC 1000000
|
||||
#define NSECS_PER_SEC 1000000000
|
||||
|
||||
static void __fatal_error(const char *test, const char *name, const char *what)
|
||||
{
|
||||
|
|
@ -438,10 +440,57 @@ static void check_delete(void)
|
|||
ksft_test_result(!tsig.signals, "check_delete\n");
|
||||
}
|
||||
|
||||
static inline int64_t calcdiff_ns(struct timespec t1, struct timespec t2)
|
||||
{
|
||||
int64_t diff;
|
||||
|
||||
diff = NSECS_PER_SEC * (int64_t)((int) t1.tv_sec - (int) t2.tv_sec);
|
||||
diff += ((int) t1.tv_nsec - (int) t2.tv_nsec);
|
||||
return diff;
|
||||
}
|
||||
|
||||
static void check_sigev_none(int which, const char *name)
|
||||
{
|
||||
struct timespec start, now;
|
||||
struct itimerspec its;
|
||||
struct sigevent sev;
|
||||
timer_t timerid;
|
||||
|
||||
memset(&sev, 0, sizeof(sev));
|
||||
sev.sigev_notify = SIGEV_NONE;
|
||||
|
||||
if (timer_create(which, &sev, &timerid))
|
||||
fatal_error(name, "timer_create()");
|
||||
|
||||
/* Start the timer to expire in 100ms and 100ms intervals */
|
||||
its.it_value.tv_sec = 0;
|
||||
its.it_value.tv_nsec = 100000000;
|
||||
its.it_interval.tv_sec = 0;
|
||||
its.it_interval.tv_nsec = 100000000;
|
||||
timer_settime(timerid, 0, &its, NULL);
|
||||
|
||||
if (clock_gettime(which, &start))
|
||||
fatal_error(name, "clock_gettime()");
|
||||
|
||||
do {
|
||||
if (clock_gettime(which, &now))
|
||||
fatal_error(name, "clock_gettime()");
|
||||
} while (calcdiff_ns(now, start) < NSECS_PER_SEC);
|
||||
|
||||
if (timer_gettime(timerid, &its))
|
||||
fatal_error(name, "timer_gettime()");
|
||||
|
||||
if (timer_delete(timerid))
|
||||
fatal_error(name, "timer_delete()");
|
||||
|
||||
ksft_test_result(its.it_value.tv_sec || its.it_value.tv_nsec,
|
||||
"check_sigev_none %s\n", name);
|
||||
}
|
||||
|
||||
int main(int argc, char **argv)
|
||||
{
|
||||
ksft_print_header();
|
||||
ksft_set_plan(10);
|
||||
ksft_set_plan(12);
|
||||
|
||||
ksft_print_msg("Testing posix timers. False negative may happen on CPU execution \n");
|
||||
ksft_print_msg("based timers if other threads run on the CPU...\n");
|
||||
|
|
@ -467,6 +516,8 @@ int main(int argc, char **argv)
|
|||
check_sig_ign(1);
|
||||
check_rearm();
|
||||
check_delete();
|
||||
check_sigev_none(CLOCK_MONOTONIC, "CLOCK_MONOTONIC");
|
||||
check_sigev_none(CLOCK_PROCESS_CPUTIME_ID, "CLOCK_PROCESS_CPUTIME_ID");
|
||||
|
||||
ksft_finished();
|
||||
}
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user