summaryrefslogtreecommitdiff
path: root/pjlib/src/pj/os_timestamp_common.c
diff options
context:
space:
mode:
authorBenny Prijono <bennylp@teluu.com>2005-11-21 16:59:47 +0000
committerBenny Prijono <bennylp@teluu.com>2005-11-21 16:59:47 +0000
commit483dfa9a40e1818c9fd1cc1dd82884ddbf243778 (patch)
treeabc1e115673177003f0ad0d51ba495e4d9f05238 /pjlib/src/pj/os_timestamp_common.c
parent4a4fe6471b8a930ec49a28cced2f7a5ea55aee26 (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.c58
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;