FTL/src/timers.c

63 lines
1.5 KiB
C

/* Pi-hole: A black hole for Internet advertisements
* (c) 2017 Pi-hole, LLC (https://pi-hole.net)
* Network-wide ad blocking via your own hardware.
*
* FTL Engine
* Timing routines
*
* This file is copyright under the latest version of the EUPL.
* Please see LICENSE file for your rights under this license. */
#include "FTL.h"
#include "timers.h"
#include "log.h"
struct timespec t0[NUMTIMERS];
void timer_start(const enum timers i)
{
if(i >= NUMTIMERS)
{
logg("Code error: Timer %i not defined in timer_start().", i);
exit(EXIT_FAILURE);
}
clock_gettime(CLOCK_REALTIME, &t0[i]);
}
static struct timespec diff(struct timespec start, struct timespec end)
{
struct timespec diff;
if(end.tv_nsec-start.tv_nsec < 0L)
{
diff.tv_sec = end.tv_sec - start.tv_sec - 1; // subtract one second here...
diff.tv_nsec = end.tv_nsec - start.tv_nsec + 1000000000L; // ...we have to add it here
}
else
{
diff.tv_sec = end.tv_sec - start.tv_sec;
diff.tv_nsec = end.tv_nsec - start.tv_nsec;
}
return diff;
}
double timer_elapsed_msec(const enum timers i)
{
if(i >= NUMTIMERS)
{
logg("Code error: Timer %i not defined in timer_elapsed_msec().", i);
exit(EXIT_FAILURE);
}
struct timespec t1, td;
clock_gettime(CLOCK_REALTIME, &t1);
td = diff(t0[i], t1);
return td.tv_sec * 1e3 + td.tv_nsec * 1e-6;
}
void sleepms(const int milliseconds)
{
struct timeval tv;
tv.tv_sec = milliseconds / 1000;
tv.tv_usec = (milliseconds % 1000) * 1000;
select(0, NULL, NULL, NULL, &tv);
}