// SPDX-License-Identifier: GPL-2.0-or-later
/*
 * Copyright (c) 2019, Linux Test Project
 * Copyright (c) Zilogic Systems Pvt. Ltd., 2018
 * Email : code@zilogic.com
 */

#ifndef TST_SAFE_CLOCKS_H__
#define TST_SAFE_CLOCKS_H__

#include <time.h>
#include <sys/timex.h>
#include "tst_test.h"
#include "lapi/syscalls.h"
#include "lapi/posix_clocks.h"

static inline void safe_clock_getres(const char *file, const int lineno,
	clockid_t clk_id, struct timespec *res)
{
	int rval;

	rval = clock_getres(clk_id, res);
	if (rval != 0)
		tst_brk(TBROK | TERRNO,
			"%s:%d clock_getres() failed", file, lineno);

}

static inline void safe_clock_gettime(const char *file, const int lineno,
	clockid_t clk_id, struct timespec *tp)
{
	int rval;

	rval = clock_gettime(clk_id, tp);
	if (rval != 0)
		tst_brk(TBROK | TERRNO,
			"%s:%d clock_gettime() failed", file, lineno);
}


static inline void safe_clock_settime(const char *file, const int lineno,
	clockid_t clk_id, struct timespec *tp)
{
	int rval;

	rval = clock_settime(clk_id, tp);
	if (rval != 0)
		tst_brk(TBROK | TERRNO,
			"%s:%d clock_gettime() failed", file, lineno);
}

static inline int safe_clock_adjtime(const char *file, const int lineno,
	clockid_t clk_id, struct timex *txc)
{
	int rval;

	rval = tst_syscall(__NR_clock_adjtime, clk_id, txc);
	if (rval < 0)
		tst_brk(TBROK | TERRNO,
			"%s:%d clock_adjtime() failed %i", file, lineno, rval);

	return rval;
}

#define SAFE_CLOCK_GETRES(clk_id, res)\
	safe_clock_getres(__FILE__, __LINE__, (clk_id), (res))

#define SAFE_CLOCK_GETTIME(clk_id, tp)\
	safe_clock_gettime(__FILE__, __LINE__, (clk_id), (tp))

#define SAFE_CLOCK_SETTIME(clk_id, tp)\
	safe_clock_settime(__FILE__, __LINE__, (clk_id), (tp))

#define SAFE_CLOCK_ADJTIME(clk_id, txc)\
	safe_clock_adjtime(__FILE__, __LINE__, (clk_id), (txc))

#endif /* SAFE_CLOCKS_H__ */
