diff options
author | Benny Prijono <bennylp@teluu.com> | 2005-11-21 16:59:47 +0000 |
---|---|---|
committer | Benny Prijono <bennylp@teluu.com> | 2005-11-21 16:59:47 +0000 |
commit | 483dfa9a40e1818c9fd1cc1dd82884ddbf243778 (patch) | |
tree | abc1e115673177003f0ad0d51ba495e4d9f05238 /pjlib/src/pj/os_timestamp_common.c | |
parent | 4a4fe6471b8a930ec49a28cced2f7a5ea55aee26 (diff) |
Added rdtsc option for win32 timestamp and added pj_elapsed_msec
git-svn-id: http://svn.pjsip.org/repos/pjproject/trunk@70 74dad513-b988-da41-8d7b-12977e46ad98
Diffstat (limited to 'pjlib/src/pj/os_timestamp_common.c')
-rw-r--r-- | pjlib/src/pj/os_timestamp_common.c | 58 |
1 files changed, 54 insertions, 4 deletions
diff --git a/pjlib/src/pj/os_timestamp_common.c b/pjlib/src/pj/os_timestamp_common.c index 4dc410f3..a86c1746 100644 --- a/pjlib/src/pj/os_timestamp_common.c +++ b/pjlib/src/pj/os_timestamp_common.c @@ -26,9 +26,14 @@ #define USEC (1000000UL) #define MSEC (1000) +#define u64tohighprec(u64) ((pj_highprec_t)((pj_int64_t)(u64))) + static pj_highprec_t get_elapsed( const pj_timestamp *start, const pj_timestamp *stop ) { +#if defined(PJ_HAS_INT64) && PJ_HAS_INT64!=0 + return u64tohighprec(stop->u64 - start->u64); +#else pj_highprec_t elapsed_hi, elapsed_lo; elapsed_hi = stop->u32.hi - start->u32.hi; @@ -38,6 +43,38 @@ static pj_highprec_t get_elapsed( const pj_timestamp *start, pj_highprec_mul(elapsed_hi, U32MAX); return elapsed_hi + elapsed_lo; +#endif +} + +static pj_highprec_t elapsed_msec( const pj_timestamp *start, + const pj_timestamp *stop ) +{ + pj_timestamp ts_freq; + pj_highprec_t freq, elapsed; + + if (pj_get_timestamp_freq(&ts_freq) != PJ_SUCCESS) + return 0; + + /* Convert frequency timestamp */ +#if defined(PJ_HAS_INT64) && PJ_HAS_INT64!=0 + freq = u64tohighprec(ts_freq.u64); +#else + freq = ts_freq.u32.hi; + pj_highprec_mul(freq, U32MAX); + freq += ts_freq.u32.lo; +#endif + + /* Avoid division by zero. */ + if (freq == 0) freq = 1; + + /* Get elapsed time in cycles. */ + elapsed = get_elapsed(start, stop); + + /* usec = elapsed * MSEC / freq */ + pj_highprec_mul(elapsed, MSEC); + pj_highprec_div(elapsed, freq); + + return elapsed; } static pj_highprec_t elapsed_usec( const pj_timestamp *start, @@ -50,9 +87,13 @@ static pj_highprec_t elapsed_usec( const pj_timestamp *start, return 0; /* Convert frequency timestamp */ +#if defined(PJ_HAS_INT64) && PJ_HAS_INT64!=0 + freq = u64tohighprec(ts_freq.u64); +#else freq = ts_freq.u32.hi; pj_highprec_mul(freq, U32MAX); freq += ts_freq.u32.lo; +#endif /* Avoid division by zero. */ if (freq == 0) freq = 1; @@ -77,9 +118,13 @@ PJ_DEF(pj_uint32_t) pj_elapsed_nanosec( const pj_timestamp *start, return 0; /* Convert frequency timestamp */ +#if defined(PJ_HAS_INT64) && PJ_HAS_INT64!=0 + freq = u64tohighprec(ts_freq.u64); +#else freq = ts_freq.u32.hi; pj_highprec_mul(freq, U32MAX); freq += ts_freq.u32.lo; +#endif /* Avoid division by zero. */ if (freq == 0) freq = 1; @@ -100,10 +145,16 @@ PJ_DEF(pj_uint32_t) pj_elapsed_usec( const pj_timestamp *start, return (pj_uint32_t)elapsed_usec(start, stop); } +PJ_DEF(pj_uint32_t) pj_elapsed_msec( const pj_timestamp *start, + const pj_timestamp *stop ) +{ + return (pj_uint32_t)elapsed_msec(start, stop); +} + PJ_DEF(pj_time_val) pj_elapsed_time( const pj_timestamp *start, const pj_timestamp *stop ) { - pj_highprec_t elapsed = elapsed_usec(start, stop); + pj_highprec_t elapsed = elapsed_msec(start, stop); pj_time_val tv_elapsed; if (PJ_HIGHPREC_VALUE_IS_ZERO(elapsed)) { @@ -113,12 +164,11 @@ PJ_DEF(pj_time_val) pj_elapsed_time( const pj_timestamp *start, pj_highprec_t sec, msec; sec = elapsed; - pj_highprec_div(sec, USEC); + pj_highprec_div(sec, MSEC); tv_elapsed.sec = (long)sec; msec = elapsed; - pj_highprec_mod(msec, USEC); - pj_highprec_div(msec, 1000); + pj_highprec_mod(msec, MSEC); tv_elapsed.msec = (long)msec; return tv_elapsed; |