blob: 76ec56dac15f0eb61992e8a46d8d00343867566c [file] [log] [blame]
/******************************************************************************/
/* Copyright (c) Crackerjack Project., 2007 */
/* */
/* This program is free software; you can redistribute it and/or modify */
/* it under the terms of the GNU General Public License as published by */
/* the Free Software Foundation; either version 2 of the License, or */
/* (at your option) any later version. */
/* */
/* This program is distributed in the hope that it will be useful, */
/* but WITHOUT ANY WARRANTY; without even the implied warranty of */
/* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See */
/* the GNU General Public License for more details. */
/* */
/* You should have received a copy of the GNU General Public License */
/* along with this program; if not, write to the Free Software */
/* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */
/* */
/******************************************************************************/
/******************************************************************************/
/* */
/* File: timer_getoverrun01.c */
/* */
/* Description: This tests the timer_getoverrun() syscall */
/* */
/* Usage: <for command-line> */
/* timer_getoverrun01 [-c n] [-e][-i n] [-I x] [-p x] [-t] */
/* where, -c n : Run n copies concurrently. */
/* -e : Turn on errno logging. */
/* -i n : Execute test n times. */
/* -I x : Execute test for x seconds. */
/* -P x : Pause for x seconds between iterations. */
/* -t : Turn on syscall timing. */
/* */
/* Total Tests: 1 */
/* */
/* Test Name: timer_getoverrun01 */
/* History: Porting from Crackerjack to LTP is done by */
/* Manas Kumar Nayak maknayak@in.ibm.com> */
/******************************************************************************/
#include <stdio.h>
#include <errno.h>
#include <time.h>
#include <signal.h>
#include <syscall.h>
/* Harness Specific Include Files. */
#include "test.h"
#include "usctest.h"
#include "linux_syscall_numbers.h"
/* timer_t in kernel(int) is different from Glibc definition(void*).
* Use the kernel definition.
*/
typedef int kernel_timer_t;
/* Extern Global Variables */
/* Global Variables */
char *TCID = "timer_getoverrun01"; /* Test program identifier. */
int testno;
int TST_TOTAL = 1; /* total number of tests in this file. */
/* Extern Global Functions */
/******************************************************************************/
/* */
/* Function: cleanup */
/* */
/* Description: Performs all one time clean up for this test on successful */
/* completion, premature exit or failure. Closes all temporary */
/* files, removes all temporary directories exits the test with */
/* appropriate return code by calling tst_exit() function. */
/* */
/* Input: None. */
/* */
/* Output: None. */
/* */
/* Return: On failure - Exits calling tst_exit(). Non '0' return code. */
/* On success - Exits calling tst_exit(). With '0' return code. */
/* */
/******************************************************************************/
extern void cleanup()
{
TEST_CLEANUP;
tst_rmdir();
tst_exit();
}
/* Local Functions */
/******************************************************************************/
/* */
/* Function: setup */
/* */
/* Description: Performs all one time setup for this test. This function is */
/* typically used to capture signals, create temporary dirs */
/* and temporary files that may be used in the course of this */
/* test. */
/* */
/* Input: None. */
/* */
/* Output: None. */
/* */
/* Return: On failure - Exits by calling cleanup(). */
/* On success - returns 0. */
/* */
/******************************************************************************/
void setup()
{
/* Capture signals if any */
/* Create temporary directories */
TEST_PAUSE;
tst_tmpdir();
}
char tmpname[40];
int parent;
int block = 1;
#define ENTER(normal) tst_resm(TINFO, "Enter block %d: test %d (%s)", \
block, Tst_count, normal?"NORMAL":"ERROR");
int main(int ac, char **av)
{
int lc;
char *msg;
kernel_timer_t created_timer_id;
struct sigevent ev;
if ((msg = parse_opts(ac, av, NULL, NULL)) != NULL) {
tst_brkm(TBROK, NULL, "OPTION PARSING ERROR - %s", msg);
tst_exit();
}
setup();
for (lc = 0; TEST_LOOPING(lc); ++lc) {
Tst_count = 0;
for (testno = 0; testno < TST_TOTAL; ++testno) {
ev.sigev_value = (sigval_t) 0;
ev.sigev_signo = SIGALRM;
ev.sigev_notify = SIGEV_SIGNAL;
TEST(ltp_syscall
(__NR_timer_create, CLOCK_REALTIME, &ev,
&created_timer_id));
ENTER(1);
TEST(ltp_syscall(__NR_timer_getoverrun,
created_timer_id));
if (TEST_RETURN == 0) {
tst_resm(TPASS, "Block %d: test %d PASSED",
block, Tst_count);
} else {
tst_resm(TFAIL,
"Block %d: test %d FAILED... errno = %d : %s",
block, Tst_count, TEST_ERRNO,
strerror(TEST_ERRNO));
cleanup();
tst_exit();
}
ENTER(0);
TEST(ltp_syscall(__NR_timer_getoverrun, -1));
if (TEST_RETURN < 0 && TEST_ERRNO == EINVAL) {
tst_resm(TPASS, "Block %d: test %d PASSED",
block, Tst_count);
} else {
tst_resm(TFAIL,
"Block %d: test %d FAILED... errno = %d : %s",
block, Tst_count, TEST_ERRNO,
strerror(TEST_ERRNO));
cleanup();
tst_exit();
}
}
}
cleanup();
tst_exit();
}
/*
NAME
timer_getoverrun
SYNOPSIS
#include <time.h>
int timer_getoverrun(timer_t timerid);
Only a single signal shall be queued to the process for a given timer
at any point in time. When a timer for which a signal is still pending
expires, no signal shall be queued, and a timer overrun shall occur.
When a timer expiration signal is delivered to or accepted by a pro-
cess, if the implementation supports the Realtime Signals Extension,
the timer_getoverrun() function shall return the timer expiration
overrun count for the specified timer. The overrun count returned con-
tains the number of extra timer expirations that occurred between the
time the signal was generated (queued) and when it was delivered or
accepted, up to but not including an implementation-defined maximum of
{DELAYTIMER_MAX}. If the number of such extra expirations is greater
than or equal to {DELAYTIMER_MAX}, then the overrun count shall be set
to {DELAYTIMER_MAX}. The value returned by timer_getoverrun() shall
apply to the most recent expiration signal delivery or acceptance for
the timer. If no expiration signal has been delivered for the timer,
or if the Realtime Signals Extension is not supported, the return
value of timer_getoverrun() is unspecified.
RETURN VALUE
If the timer_getoverrun() function succeeds, it shall return the timer
expiration overrun count as explained above.
*/