sintonia/library/ecasound-2.7.2/kvutils/kvu_timestamp.h

134 lines
3.5 KiB
C

// ------------------------------------------------------------------------
// kvu_timestamp.h: Monotonic timestamps
// Copyright (C) 2009 Kai Vehmanen
//
// Attributes:
// eca-style-version: 3
//
// This program 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 2 of the License, or
// (at your option) any later version.
//
// This program 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
// ------------------------------------------------------------------------
#ifndef INCLUDED_KVU_TIMESTAMP_H
#define INCLUDED_KVU_TIMESTAMP_H
#include <time.h>
/**
* Returns non-zero if clock is monotonic.
*
* See POSIX 'CLOCK_MONOTONIC'
*/
int kvu_clock_is_monotonic(void);
/**
* Finds the resolution (precision) of the clock
* source.
*
* See POSIX clock_getres().
*/
int kvu_clock_getres(struct kvu_timespec *res);
/**
* Retrieves a timestamp
*
* See POSIX clock_gettime()
*/
int kvu_clock_gettime(struct timespec *tp);
/**
* Returns the timestamp as seconds
*/
static inline double kvu_timespec_seconds(struct timespec *tp)
{
return tp->tv_sec +
(static_cast<double>(tp->tv_nsec) / 1000000000.0);
}
/**
* Adapted from macro definitions in glibc's sys/time.h (LGPL 2.1)
*/
static inline void kvu_timespec_clear(struct timespec *tvp)
{
tvp->tv_sec = tvp->tv_nsec = 0;
}
static inline void kvu_timespec_assign(struct timespec *x, const struct timespec *y)
{
x->tv_sec = y->tv_sec;
x->tv_nsec = y->tv_nsec;
}
/**
* result = a + b
*
* Adapted from macro definitions in glibc's sys/time.h (LGPL 2.1)
*/
static inline void kvu_timespec_add(const struct timespec *a,
const struct timespec *b,
struct timespec *result)
{
(result)->tv_sec = (a)->tv_sec + (b)->tv_sec;
(result)->tv_nsec = (a)->tv_nsec + (b)->tv_nsec;
if ((result)->tv_nsec >= 1000000000) {
++(result)->tv_sec;
(result)->tv_nsec -= 1000000000;
}
}
/**
* Returns 'a < b'
*
* Adapted from macro definitions in glibc's sys/time.h (LGPL 2.1)
*/
static inline int kvu_timespec_cmp_lt(const struct timespec *a,
const struct timespec *b)
{
return (((a)->tv_sec == (b)->tv_sec) ?
((a)->tv_nsec < (b)->tv_nsec) :
((a)->tv_sec < (b)->tv_sec));
}
/**
* Returns 'a > b'
*
* Adapted from macro definitions in glibc's sys/time.h (LGPL 2.1)
*/
static inline int kvu_timespec_cmp_gt(const struct timespec *a,
const struct timespec *b)
{
return (((a)->tv_sec == (b)->tv_sec) ?
((a)->tv_nsec > (b)->tv_nsec) :
((a)->tv_sec > (b)->tv_sec));
}
/**
* result = a - b
*
* Adapted from macro definitions in glibc's sys/time.h (LGPL 2.1)
*/
static inline void kvu_timespec_sub(const struct timespec *a,
const struct timespec *b,
struct timespec *result)
{
(result)->tv_sec = (a)->tv_sec - (b)->tv_sec;
(result)->tv_nsec = (a)->tv_nsec - (b)->tv_nsec;
if ((result)->tv_nsec < 0) {
--(result)->tv_sec;
(result)->tv_nsec += 1000000000;
}
} \
#endif /* INCLUDED_KVU_TIMESTAMP_H */