Home | History | Annotate | Download | only in lib
      1 // SPDX-License-Identifier: GPL-2.0
      2 /*
      3  * Copyright (C) 2015 Cyril Hrubis <chrubis (at) suse.cz>
      4  */
      5 
      6 #include <errno.h>
      7 
      8 #define TST_NO_DEFAULT_MAIN
      9 
     10 #include "tst_test.h"
     11 #include "tst_timer.h"
     12 #include "tst_clocks.h"
     13 #include "lapi/posix_clocks.h"
     14 
     15 static struct timespec start_time, stop_time;
     16 static clockid_t clock_id;
     17 
     18 static const char *clock_name(clockid_t clk_id)
     19 {
     20 	switch (clk_id) {
     21 	case CLOCK_REALTIME:
     22 		return "CLOCK_REALTIME";
     23 	case CLOCK_REALTIME_COARSE:
     24 		return "CLOCK_REALTIME_COARSE";
     25 	case CLOCK_MONOTONIC:
     26 		return "CLOCK_MONOTONIC";
     27 	case CLOCK_MONOTONIC_COARSE:
     28 		return "CLOCK_MONOTONIC_COARSE";
     29 	case CLOCK_MONOTONIC_RAW:
     30 		return "CLOCK_MONOTONIC_RAW";
     31 	case CLOCK_BOOTTIME:
     32 		return "CLOCK_BOOTTIME";
     33 	case CLOCK_PROCESS_CPUTIME_ID:
     34 		return "CLOCK_PROCESS_CPUTIME_ID";
     35 	case CLOCK_THREAD_CPUTIME_ID:
     36 		return "CLOCK_THREAD_CPUTIME_ID";
     37 	default:
     38 		return "UNKNOWN/INVALID";
     39 	}
     40 }
     41 
     42 void tst_timer_check(clockid_t clk_id)
     43 {
     44 	if (tst_clock_gettime(clk_id, &start_time)) {
     45 		if (errno == EINVAL) {
     46 			tst_brk(TCONF,
     47 			         "Clock id %s(%u) not supported by kernel",
     48 				 clock_name(clk_id), clk_id);
     49 			return;
     50 		}
     51 
     52 		tst_brk(TBROK | TERRNO, "tst_clock_gettime() failed");
     53 	}
     54 }
     55 
     56 void tst_timer_start(clockid_t clk_id)
     57 {
     58 	clock_id = clk_id;
     59 
     60 	if (tst_clock_gettime(clock_id, &start_time))
     61 		tst_res(TWARN | TERRNO, "tst_clock_gettime() failed");
     62 }
     63 
     64 int tst_timer_expired_ms(long long ms)
     65 {
     66 	struct timespec cur_time;
     67 
     68 	if (tst_clock_gettime(clock_id, &cur_time))
     69 		tst_res(TWARN | TERRNO, "tst_clock_gettime() failed");
     70 
     71 	return tst_timespec_diff_ms(cur_time, start_time) >= ms;
     72 }
     73 
     74 void tst_timer_stop(void)
     75 {
     76 	if (tst_clock_gettime(clock_id, &stop_time))
     77 		tst_res(TWARN | TERRNO, "tst_clock_gettime() failed");
     78 }
     79 
     80 struct timespec tst_timer_elapsed(void)
     81 {
     82 	return tst_timespec_diff(stop_time, start_time);
     83 }
     84