/*
 * Copyright (C) 2011-2021 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 <http://www.gnu.org/licenses/>.
 */

#ifndef BENCHMARK_H
# define BENCHMARK_H

#include <sys/time.h>
#include <time.h>
#include <signal.h>
#if defined _WIN32
#include <windows.h>
#endif
#include <time.h>
#include "timespec.h"          /* gnulib gettime */

typedef void (*sighandler_t) (int);

struct benchmark_st
{
  struct timespec start;
  unsigned long size;
  sighandler_t old_handler;
#if defined _WIN32
  HANDLE wtimer;
  HANDLE wthread;
  LARGE_INTEGER alarm_timeout;
#endif
};

extern int benchmark_must_finish;

void start_benchmark (struct benchmark_st *st);
double stop_benchmark (struct benchmark_st *st, const char *metric);

inline static unsigned int
timespec_sub_ms (struct timespec *a, struct timespec *b)
{
  return (a->tv_sec * 1000 + a->tv_nsec / (1000 * 1000) -
	  (b->tv_sec * 1000 + b->tv_nsec / (1000 * 1000)));
}

#endif /* BENCHMARK_H */
