157 lines
5.5 KiB
C++
157 lines
5.5 KiB
C++
/* -*- c++ -*- */
|
|
/*
|
|
* Copyright 2011,2013 Free Software Foundation, Inc.
|
|
*
|
|
* This file is part of GNU Radio
|
|
*
|
|
* GNU Radio 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, or (at your option)
|
|
* any later version.
|
|
*
|
|
* GNU Radio 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, write to the Free Software Foundation, Inc.,
|
|
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
|
*/
|
|
|
|
#ifndef INCLUDED_GNURADIO_HIGH_RES_TIMER_H
|
|
#define INCLUDED_GNURADIO_HIGH_RES_TIMER_H
|
|
|
|
#include <gnuradio/api.h>
|
|
|
|
////////////////////////////////////////////////////////////////////////
|
|
// Use architecture defines to determine the implementation
|
|
////////////////////////////////////////////////////////////////////////
|
|
#if defined(linux) || defined(__linux) || defined(__linux__)
|
|
#define GNURADIO_HRT_USE_CLOCK_GETTIME
|
|
#include <ctime>
|
|
#elif defined(_WIN32) || defined(__WIN32__) || defined(WIN32)
|
|
#define GNURADIO_HRT_USE_QUERY_PERFORMANCE_COUNTER
|
|
#elif defined(macintosh) || defined(__APPLE__) || defined(__APPLE_CC__)
|
|
#define GNURADIO_HRT_USE_MACH_ABSOLUTE_TIME
|
|
#elif defined(__FreeBSD__) || defined(__NetBSD__) || defined(__OpenBSD__)
|
|
#define GNURADIO_HRT_USE_CLOCK_GETTIME
|
|
#include <ctime>
|
|
#else
|
|
#define GNURADIO_HRT_USE_MICROSEC_CLOCK
|
|
#endif
|
|
|
|
|
|
////////////////////////////////////////////////////////////////////////
|
|
namespace gr {
|
|
|
|
//! Typedef for the timer tick count
|
|
typedef signed long long high_res_timer_type;
|
|
|
|
//! Get the current time in ticks
|
|
high_res_timer_type high_res_timer_now(void);
|
|
|
|
//! Get the current time in ticks - for performance monitoring
|
|
high_res_timer_type high_res_timer_now_perfmon(void);
|
|
|
|
//! Get the number of ticks per second
|
|
high_res_timer_type high_res_timer_tps(void);
|
|
|
|
//! Get the tick count at the epoch
|
|
high_res_timer_type high_res_timer_epoch(void);
|
|
|
|
#ifdef GNURADIO_HRT_USE_CLOCK_GETTIME
|
|
//! storage for high res timer type
|
|
GR_RUNTIME_API extern clockid_t high_res_timer_source;
|
|
#endif
|
|
|
|
} /* namespace gr */
|
|
|
|
////////////////////////////////////////////////////////////////////////
|
|
#ifdef GNURADIO_HRT_USE_CLOCK_GETTIME
|
|
inline gr::high_res_timer_type gr::high_res_timer_now(void){
|
|
timespec ts;
|
|
clock_gettime(CLOCK_MONOTONIC, &ts);
|
|
return ts.tv_sec*high_res_timer_tps() + ts.tv_nsec;
|
|
}
|
|
|
|
inline gr::high_res_timer_type gr::high_res_timer_now_perfmon(void){
|
|
timespec ts;
|
|
clock_gettime(high_res_timer_source, &ts);
|
|
return ts.tv_sec*high_res_timer_tps() + ts.tv_nsec;
|
|
}
|
|
|
|
inline gr::high_res_timer_type gr::high_res_timer_tps(void){
|
|
return 1000000000UL;
|
|
}
|
|
#endif /* GNURADIO_HRT_USE_CLOCK_GETTIME */
|
|
|
|
////////////////////////////////////////////////////////////////////////
|
|
#ifdef GNURADIO_HRT_USE_MACH_ABSOLUTE_TIME
|
|
#include <mach/mach_time.h>
|
|
|
|
inline gr::high_res_timer_type gr::high_res_timer_now(void){
|
|
return mach_absolute_time();
|
|
}
|
|
|
|
inline gr::high_res_timer_type gr::high_res_timer_now_perfmon(void){
|
|
return gr::high_res_timer_now();
|
|
}
|
|
|
|
inline gr::high_res_timer_type gr::high_res_timer_tps(void){
|
|
mach_timebase_info_data_t info;
|
|
mach_timebase_info(&info);
|
|
return gr::high_res_timer_type(info.numer*1000000000UL)/info.denom;
|
|
}
|
|
#endif
|
|
|
|
////////////////////////////////////////////////////////////////////////
|
|
#ifdef GNURADIO_HRT_USE_QUERY_PERFORMANCE_COUNTER
|
|
#include <Windows.h>
|
|
|
|
inline gr::high_res_timer_type gr::high_res_timer_now(void){
|
|
LARGE_INTEGER counts;
|
|
QueryPerformanceCounter(&counts);
|
|
return counts.QuadPart;
|
|
}
|
|
|
|
inline gr::high_res_timer_type gr::high_res_timer_now_perfmon(void){
|
|
return gr::high_res_timer_now();
|
|
}
|
|
|
|
inline gr::high_res_timer_type gr::high_res_timer_tps(void){
|
|
LARGE_INTEGER freq;
|
|
QueryPerformanceFrequency(&freq);
|
|
return freq.QuadPart;
|
|
}
|
|
#endif
|
|
|
|
////////////////////////////////////////////////////////////////////////
|
|
#ifdef GNURADIO_HRT_USE_MICROSEC_CLOCK
|
|
#include <boost/date_time/posix_time/posix_time.hpp>
|
|
|
|
inline gr::high_res_timer_type gr::high_res_timer_now(void){
|
|
static const boost::posix_time::ptime epoch(boost::posix_time::from_time_t(0));
|
|
return (boost::posix_time::microsec_clock::universal_time() - epoch).ticks();
|
|
}
|
|
|
|
inline gr::high_res_timer_type gr::high_res_timer_now_perfmon(void){
|
|
return gr::high_res_timer_now();
|
|
}
|
|
|
|
inline gr::high_res_timer_type gr::high_res_timer_tps(void){
|
|
return boost::posix_time::time_duration::ticks_per_second();
|
|
}
|
|
#endif
|
|
|
|
////////////////////////////////////////////////////////////////////////
|
|
#include <boost/date_time/posix_time/posix_time.hpp>
|
|
|
|
inline gr::high_res_timer_type gr::high_res_timer_epoch(void){
|
|
static const double hrt_ticks_per_utc_ticks = gr::high_res_timer_tps()/double(boost::posix_time::time_duration::ticks_per_second());
|
|
boost::posix_time::time_duration utc = boost::posix_time::microsec_clock::universal_time() - boost::posix_time::from_time_t(0);
|
|
return gr::high_res_timer_now() - utc.ticks()*hrt_ticks_per_utc_ticks;
|
|
}
|
|
|
|
#endif /* INCLUDED_GNURADIO_HIGH_RES_TIMER_H */
|