/*
* Copyright (C) 2011 Free Software Foundation, Inc.
*
* This file is part of GnuTLS.
*
* GnuTLS is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* GnuTLS is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see .
*/
#include
#include
#include
#include
#include
#include
#include "benchmark.h"
int benchmark_must_finish = 0;
static void
alarm_handler (int signo)
{
benchmark_must_finish = 1;
}
int start_benchmark(struct benchmark_st * st)
{
int ret;
struct itimerval timer;
memset(st, 0, sizeof(*st));
st->old_handler = signal (SIGPROF, alarm_handler);
ret = gettimeofday (&st->start, NULL);
if (ret < 0) {
perror("gettimeofday");
return -1;
}
benchmark_must_finish = 0;
memset(&timer, 0, sizeof(timer));
timer.it_value.tv_sec = 0;
timer.it_value.tv_usec = 100*1000;
ret = setitimer(ITIMER_PROF, &timer, NULL);
if (ret < 0) {
perror("setitimer");
return -1;
}
return 0;
}
/* Returns -1 on error or 0 on success.
* elapsed: the elapsed time in milliseconds
*/
int stop_benchmark(struct benchmark_st * st, unsigned long * elapsed)
{
unsigned long msecs;
struct timeval stop;
int ret;
signal(SIGPROF, st->old_handler);
ret = gettimeofday (&stop, NULL);
if (ret < 0)
return -1;
msecs = (stop.tv_sec * 1000 + stop.tv_usec / 1000 -
(st->start.tv_sec * 1000 + st->start.tv_usec / (1000)));
if (elapsed) *elapsed = msecs;
return 0;
}