Wed Oct 28 11:51:08 2009

Asterisk developer's documentation


time.h

Go to the documentation of this file.
00001 /*
00002  * Asterisk -- An open source telephony toolkit.
00003  *
00004  * Copyright (C) 1999 - 2005, Digium, Inc.
00005  *
00006  * Mark Spencer <markster@digium.com>
00007  *
00008  * See http://www.asterisk.org for more information about
00009  * the Asterisk project. Please do not directly contact
00010  * any of the maintainers of this project for assistance;
00011  * the project provides a web site, mailing lists and IRC
00012  * channels for your use.
00013  *
00014  * This program is free software, distributed under the terms of
00015  * the GNU General Public License Version 2. See the LICENSE file
00016  * at the top of the source tree.
00017  */
00018 
00019 /*! \file
00020  * \brief Time-related functions and macros
00021  */
00022 
00023 #ifndef _ASTERISK_TIME_H
00024 #define _ASTERISK_TIME_H
00025 
00026 #ifdef HAVE_SYS_TIME_H
00027 #include <sys/time.h>
00028 #endif
00029 
00030 #include "asterisk/inline_api.h"
00031 
00032 /* We have to let the compiler learn what types to use for the elements of a
00033    struct timeval since on linux, it's time_t and suseconds_t, but on *BSD,
00034    they are just a long. */
00035 extern struct timeval tv;
00036 typedef typeof(tv.tv_sec) ast_time_t;
00037 typedef typeof(tv.tv_usec) ast_suseconds_t;
00038 
00039 /*!
00040  * \brief Computes the difference (in seconds) between two \c struct \c timeval instances.
00041  * \param end the end of the time period
00042  * \param start the beginning of the time period
00043  * \return the difference in seconds
00044  */
00045 AST_INLINE_API(
00046 int ast_tvdiff_sec(struct timeval end, struct timeval start),
00047 {
00048    int result = end.tv_sec - start.tv_sec;
00049    if (result > 0 && end.tv_usec < start.tv_usec)
00050       result--;
00051    else if (result < 0 && end.tv_usec > start.tv_usec)
00052       result++;
00053 
00054    return result;
00055 }
00056 )
00057 
00058 /*!
00059  * \brief Computes the difference (in microseconds) between two \c struct \c timeval instances.
00060  * \param end the end of the time period
00061  * \param start the beginning of the time period
00062  * \return the difference in microseconds
00063  */
00064 AST_INLINE_API(
00065 int64_t ast_tvdiff_us(struct timeval end, struct timeval start),
00066 {
00067    return (end.tv_sec - start.tv_sec) * (int64_t) 1000000 +
00068       end.tv_usec - start.tv_usec;
00069 }
00070 )
00071 
00072 /*!
00073  * \brief Computes the difference (in milliseconds) between two \c struct \c timeval instances.
00074  * \param end end of the time period
00075  * \param start beginning of the time period
00076  * \return the difference in milliseconds
00077  */
00078 AST_INLINE_API(
00079 int ast_tvdiff_ms(struct timeval end, struct timeval start),
00080 {
00081    /* the offset by 1,000,000 below is intentional...
00082       it avoids differences in the way that division
00083       is handled for positive and negative numbers, by ensuring
00084       that the divisor is always positive
00085    */
00086    return  ((end.tv_sec - start.tv_sec) * 1000) +
00087       (((1000000 + end.tv_usec - start.tv_usec) / 1000) - 1000);
00088 }
00089 )
00090 
00091 /*!
00092  * \brief Returns true if the argument is 0,0
00093  */
00094 AST_INLINE_API(
00095 int ast_tvzero(const struct timeval t),
00096 {
00097    return (t.tv_sec == 0 && t.tv_usec == 0);
00098 }
00099 )
00100 
00101 /*!
00102  * \brief Compres two \c struct \c timeval instances returning
00103  * -1, 0, 1 if the first arg is smaller, equal or greater to the second.
00104  */
00105 AST_INLINE_API(
00106 int ast_tvcmp(struct timeval _a, struct timeval _b),
00107 {
00108    if (_a.tv_sec < _b.tv_sec)
00109       return -1;
00110    if (_a.tv_sec > _b.tv_sec)
00111       return 1;
00112    /* now seconds are equal */
00113    if (_a.tv_usec < _b.tv_usec)
00114       return -1;
00115    if (_a.tv_usec > _b.tv_usec)
00116       return 1;
00117    return 0;
00118 }
00119 )
00120 
00121 /*!
00122  * \brief Returns true if the two \c struct \c timeval arguments are equal.
00123  */
00124 AST_INLINE_API(
00125 int ast_tveq(struct timeval _a, struct timeval _b),
00126 {
00127    return (_a.tv_sec == _b.tv_sec && _a.tv_usec == _b.tv_usec);
00128 }
00129 )
00130 
00131 /*!
00132  * \brief Returns current timeval. Meant to replace calls to gettimeofday().
00133  */
00134 AST_INLINE_API(
00135 struct timeval ast_tvnow(void),
00136 {
00137    struct timeval t;
00138    gettimeofday(&t, NULL);
00139    return t;
00140 }
00141 )
00142 
00143 /*!
00144  * \brief Returns the sum of two timevals a + b
00145  */
00146 struct timeval ast_tvadd(struct timeval a, struct timeval b);
00147 
00148 /*!
00149  * \brief Returns the difference of two timevals a - b
00150  */
00151 struct timeval ast_tvsub(struct timeval a, struct timeval b);
00152 
00153 /*!
00154  * \brief Returns a timeval from sec, usec
00155  */
00156 AST_INLINE_API(
00157 struct timeval ast_tv(ast_time_t sec, ast_suseconds_t usec),
00158 {
00159    struct timeval t;
00160    t.tv_sec = sec;
00161    t.tv_usec = usec;
00162    return t;
00163 }
00164 )
00165 
00166 /*!
00167  * \brief Returns a timeval corresponding to the duration of n samples at rate r.
00168  * Useful to convert samples to timevals, or even milliseconds to timevals
00169  * in the form ast_samp2tv(milliseconds, 1000)
00170  */
00171 AST_INLINE_API(
00172 struct timeval ast_samp2tv(unsigned int _nsamp, unsigned int _rate),
00173 {
00174    return ast_tv(_nsamp / _rate, ((_nsamp % _rate) * (4000000 / _rate)) / 4); /* this calculation is accurate up to 32000Hz. */
00175 }
00176 )
00177 
00178 #endif /* _ASTERISK_TIME_H */

Generated on Wed Oct 28 11:51:08 2009 for Asterisk - the Open Source PBX by  doxygen 1.5.6