xref: /third_party/ltp/include/tst_safe_clocks.h (revision f08c3bdf)
1// SPDX-License-Identifier: GPL-2.0-or-later
2/*
3 * Copyright (c) 2019, Linux Test Project
4 * Copyright (c) Zilogic Systems Pvt. Ltd., 2018
5 * Email : code@zilogic.com
6 */
7
8#ifndef TST_SAFE_CLOCKS_H__
9#define TST_SAFE_CLOCKS_H__
10
11#include <time.h>
12#include <sys/timex.h>
13#include "tst_test.h"
14#include "tst_clocks.h"
15#include "lapi/syscalls.h"
16#include "lapi/posix_clocks.h"
17
18static inline int safe_clock_getres(const char *file, const int lineno,
19	clockid_t clk_id, struct timespec *res)
20{
21	int rval;
22
23	rval = clock_getres(clk_id, res);
24
25	if (rval == -1) {
26		tst_brk_(file, lineno, TBROK | TERRNO,
27			"clock_getres(%s) failed", tst_clock_name(clk_id));
28	} else if (rval) {
29		tst_brk_(file, lineno, TBROK | TERRNO,
30			"Invalid clock_getres(%s) return value %d",
31			tst_clock_name(clk_id), rval);
32	}
33
34	return rval;
35}
36
37static inline int safe_clock_gettime(const char *file, const int lineno,
38	clockid_t clk_id, struct timespec *tp)
39{
40	int rval;
41
42	rval = clock_gettime(clk_id, tp);
43
44	if (rval == -1) {
45		tst_brk_(file, lineno, TBROK | TERRNO,
46			"clock_gettime(%s) failed", tst_clock_name(clk_id));
47	} else if (rval) {
48		tst_brk_(file, lineno, TBROK | TERRNO,
49			"Invalid clock_gettime(%s) return value %d",
50			tst_clock_name(clk_id), rval);
51	}
52
53	return rval;
54}
55
56
57static inline int safe_clock_settime(const char *file, const int lineno,
58	clockid_t clk_id, struct timespec *tp)
59{
60	int rval;
61
62	rval = clock_settime(clk_id, tp);
63
64	if (rval == -1) {
65		tst_brk_(file, lineno, TBROK | TERRNO,
66			"clock_gettime(%s) failed", tst_clock_name(clk_id));
67	} else if (rval) {
68		tst_brk_(file, lineno, TBROK | TERRNO,
69			"Invalid clock_gettime(%s) return value %d",
70			tst_clock_name(clk_id), rval);
71	}
72
73	return rval;
74}
75
76static inline int safe_timer_create(const char *file, const int lineno,
77	clockid_t clockid, struct sigevent *sevp, timer_t *timerid)
78{
79	int ret;
80
81	errno = 0;
82	ret = timer_create(clockid, sevp, timerid);
83
84	if (ret == -1) {
85		tst_brk_(file, lineno, TBROK | TERRNO,
86			"timer_create(%s) failed", tst_clock_name(clockid));
87	} else if (ret) {
88		tst_brk_(file, lineno, TBROK | TERRNO,
89			"Invalid timer_create(%s) return value %d",
90			tst_clock_name(clockid), ret);
91	}
92
93	return ret;
94}
95
96static inline int safe_timer_settime(const char *file, const int lineno,
97	timer_t timerid, int flags, const struct itimerspec *new_value,
98	struct itimerspec *old_value)
99{
100	int ret;
101
102	errno = 0;
103	ret = timer_settime(timerid, flags, new_value, old_value);
104
105	if (ret == -1) {
106		tst_brk_(file, lineno, TBROK | TERRNO,
107			"timer_settime() failed");
108	} else if (ret) {
109		tst_brk_(file, lineno, TBROK | TERRNO,
110			"Invalid timer_settime() return value %d", ret);
111	}
112
113	return ret;
114}
115
116static inline int safe_timer_gettime(const char *file, const int lineno,
117	timer_t timerid, struct itimerspec *curr_value)
118{
119	int ret;
120
121	errno = 0;
122	ret = timer_gettime(timerid, curr_value);
123
124	if (ret == -1) {
125		tst_brk_(file, lineno, TBROK | TERRNO,
126			"timer_gettime() failed");
127	} else if (ret) {
128		tst_brk_(file, lineno, TBROK | TERRNO,
129			"Invalid timer_gettime() return value %d", ret);
130	}
131
132	return ret;
133}
134
135static inline int safe_timer_delete(const char *file, const int lineno,
136	timer_t timerid)
137{
138	int ret;
139
140	errno = 0;
141	ret = timer_delete(timerid);
142
143	if (ret == -1) {
144		tst_brk_(file, lineno, TBROK | TERRNO, "timer_delete() failed");
145	} else if (ret) {
146		tst_brk_(file, lineno, TBROK | TERRNO,
147			"Invalid timer_delete() return value %d", ret);
148	}
149
150	return ret;
151}
152
153#define SAFE_CLOCK_GETRES(clk_id, res)\
154	safe_clock_getres(__FILE__, __LINE__, (clk_id), (res))
155
156#define SAFE_CLOCK_GETTIME(clk_id, tp)\
157	safe_clock_gettime(__FILE__, __LINE__, (clk_id), (tp))
158
159#define SAFE_CLOCK_SETTIME(clk_id, tp)\
160	safe_clock_settime(__FILE__, __LINE__, (clk_id), (tp))
161
162#define SAFE_TIMER_CREATE(clockid, sevp, timerid)\
163	safe_timer_create(__FILE__, __LINE__, (clockid), (sevp), (timerid))
164
165#define SAFE_TIMER_SETTIME(timerid, flags, new_value, old_value)\
166	safe_timer_settime(__FILE__, __LINE__, (timerid), (flags),\
167		(new_value), (old_value))
168
169#define SAFE_TIMER_GETTIME(timerid, curr_value)\
170	safe_timer_gettime(__FILE__, __LINE__, (timerid), (curr_value))
171
172#define SAFE_TIMER_DELETE(timerid)\
173	safe_timer_delete(__FILE__, __LINE__, timerid)
174
175#endif /* SAFE_CLOCKS_H__ */
176