Skip to content

Commit 92745b5

Browse files
posix: implement timer_getoverrun()
Address missing POSIX function and tests zephyrproject-rtos#59956 Signed-off-by: Harshil Bhatt <[email protected]>
1 parent c15ff10 commit 92745b5

File tree

4 files changed

+57
-0
lines changed

4 files changed

+57
-0
lines changed

include/zephyr/posix/time.h

+1
Original file line numberDiff line numberDiff line change
@@ -94,6 +94,7 @@ int timer_delete(timer_t timerid);
9494
int timer_gettime(timer_t timerid, struct itimerspec *its);
9595
int timer_settime(timer_t timerid, int flags, const struct itimerspec *value,
9696
struct itimerspec *ovalue);
97+
int timer_getoverrun(timer_t timerid);
9798
int nanosleep(const struct timespec *rqtp, struct timespec *rmtp);
9899

99100
#ifdef __cplusplus

lib/posix/Kconfig.timer

+7
Original file line numberDiff line numberDiff line change
@@ -14,3 +14,10 @@ config TIMER_CREATE_WAIT
1414
help
1515
This controls how long to wait for resources to come available to create
1616
a new timer in POSIX compliant application
17+
18+
config TIMER_DELAYTIMER_MAX
19+
int "Maximum count returned my timer_getoverrun() in POSIX application"
20+
default 20
21+
help
22+
This controls the maximum number of times a timer can overrun before
23+
timer_getoverrun() in POSIX compliant application.

lib/posix/timer.c

+23
Original file line numberDiff line numberDiff line change
@@ -179,6 +179,29 @@ int timer_settime(timer_t timerid, int flags, const struct itimerspec *value,
179179
return 0;
180180
}
181181

182+
/**
183+
* @brief Returns the timer expiration overrun count.
184+
*
185+
* See IEEE 1003.1
186+
*/
187+
int timer_getoverrun(timer_t timerid)
188+
{
189+
struct timer_obj *timer = (struct timer_obj *) timerid;
190+
191+
if (timer == NULL) {
192+
errno = EINVAL;
193+
return -1;
194+
}
195+
196+
int overruns = k_timer_status_get(&timer->ztimer) - 1;
197+
198+
if (overruns > CONFIG_TIMER_DELAYTIMER_MAX) {
199+
overruns = CONFIG_TIMER_DELAYTIMER_MAX;
200+
}
201+
202+
return overruns;
203+
}
204+
182205
/**
183206
* @brief Delete a per-process timer.
184207
*

tests/posix/common/src/timer.c

+26
Original file line numberDiff line numberDiff line change
@@ -68,6 +68,7 @@ ZTEST(posix_apis, test_timer)
6868
sleep(SECS_TO_SLEEP);
6969

7070
clock_gettime(CLOCK_MONOTONIC, &te);
71+
zassert_equal(ret, 0, "Number of timer overruns is incorrect");
7172
timer_delete(timerid);
7273

7374
if (te.tv_nsec >= ts.tv_nsec) {
@@ -83,7 +84,32 @@ ZTEST(posix_apis, test_timer)
8384
(value.it_interval.tv_sec * NSEC_PER_SEC +
8485
value.it_interval.tv_nsec)) / NSEC_PER_SEC;
8586

87+
8688
/*TESTPOINT: Check if POSIX timer test passed*/
8789
zassert_equal(total_secs_timer, secs_elapsed,
8890
"POSIX timer test has failed");
8991
}
92+
93+
ZTEST(posix_apis, test_timer_overrun)
94+
{
95+
timer_t timerid;
96+
struct sigevent sig = { 0 };
97+
struct itimerspec value;
98+
99+
sig.sigev_notify = SIGEV_NONE;
100+
101+
timer_create(CLOCK_MONOTONIC, &sig, &timerid);
102+
103+
/*Set the timer to expire every 500 milliseconds*/
104+
value.it_interval.tv_sec = 0;
105+
value.it_interval.tv_nsec = 500000000;
106+
value.it_value.tv_sec = 0;
107+
value.it_value.tv_nsec = 500000000;
108+
timer_settime(timerid, 0, &value, NULL);
109+
k_sleep(K_MSEC(2500));
110+
111+
int overruns = timer_getoverrun(timerid);
112+
113+
timer_delete(timerid);
114+
zassert_equal(overruns, 4, "Number of overruns is incorrect");
115+
}

0 commit comments

Comments
 (0)