3 /* nettle, low-level cryptographics library
5 * Copyright (C) 2013 Niels Möller
7 * The nettle library is free software; you can redistribute it and/or modify
8 * it under the terms of the GNU Lesser General Public License as published by
9 * the Free Software Foundation; either version 2.1 of the License, or (at your
10 * option) any later version.
12 * The nettle library is distributed in the hope that it will be useful, but
13 * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
14 * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public
15 * License for more details.
17 * You should have received a copy of the GNU Lesser General Public License
18 * along with the nettle library; see the file COPYING.LIB. If not, write to
19 * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
36 #if HAVE_CLOCK_GETTIME && defined CLOCK_PROCESS_CPUTIME_ID
37 #define TRY_CLOCK_GETTIME 1
38 struct timespec cgt_start;
40 static void NORETURN PRINTF_STYLE(1,2)
41 die(const char *format, ...)
44 va_start(args, format);
45 vfprintf(stderr, format, args);
55 return clock_gettime(CLOCK_PROCESS_CPUTIME_ID, &now) == 0;
61 if (clock_gettime(CLOCK_PROCESS_CPUTIME_ID, &cgt_start) < 0)
62 die("clock_gettime failed: %s\n", strerror(errno));
69 if (clock_gettime(CLOCK_PROCESS_CPUTIME_ID, &end) < 0)
70 die("clock_gettime failed: %s\n", strerror(errno));
72 return end.tv_sec - cgt_start.tv_sec
73 + 1e-9 * (end.tv_nsec - cgt_start.tv_nsec);
75 #endif /* !HAVE_CLOCK_GETTIME */
77 static clock_t clock_start;
80 clock_time_start(void)
82 clock_start = clock();
88 return (double) (clock() - (clock_start)) / CLOCKS_PER_SEC;
91 void (*time_start)(void) = clock_time_start;
92 double (*time_end)(void) = clock_time_end;
96 /* Choose timing function */
100 time_start = cgt_time_start;
101 time_end = cgt_time_end;
105 fprintf(stderr, "clock_gettime not working, falling back to clock\n");
106 time_start = clock_time_start;
107 time_end = clock_time_end;