<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2//EN">
<HTML>
<HEAD>
<META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=windows-1250">
<META NAME="Generator" CONTENT="MS Exchange Server version 5.5.2654.45">
<TITLE>[PATCH] cl_timer</TITLE>
</HEAD>
<BODY>

<P><FONT SIZE=2>Fab</FONT>
</P>

<P><FONT SIZE=2>Attached patch for supporting nsec in timer stamp and provide way to get the CPU freq</FONT>
<BR><FONT SIZE=2>We use this in our performance tests (I hope that we upload them, to the OpenIB in the near future)</FONT>
</P>

<P><FONT SIZE=2>(I left the cl_get_time_stamp_sec as is so we will not require to change old code)</FONT>
</P>

<P><FONT SIZE=2>10x</FONT>
<BR><FONT SIZE=2>Yossi</FONT>
</P>

<P><FONT SIZE=2>Singed-off-by: Yossi Leybovice (sleybo@mellanox.co.il)</FONT>
</P>
<BR>

<P><FONT SIZE=2>--- C:\sleybo\OpenIB\core\complib\user\cl_timer.c Sun Sep 04 09:41:58 2005</FONT>
<BR><FONT SIZE=2>+++ C:\sleybo\clean\core\complib\user\cl_timer.c Thu Sep 15 12:39:02 2005</FONT>
<BR><FONT SIZE=2>@@ -149,6 +149,7 @@</FONT>
<BR><FONT SIZE=2> </FONT>
<BR><FONT SIZE=2> </FONT>
<BR><FONT SIZE=2> #define SEC_TO_MICRO  1000000ULL // s to µs conversion</FONT>
<BR><FONT SIZE=2>+#define SEC_TO_NANO  1000000000ULL // s to µs conversion</FONT>
<BR><FONT SIZE=2> </FONT>
<BR><FONT SIZE=2> uint64_t</FONT>
<BR><FONT SIZE=2> cl_get_time_stamp( void )</FONT>
<BR><FONT SIZE=2>@@ -164,8 +165,48 @@</FONT>
<BR><FONT SIZE=2>  return( tick_count.QuadPart / (frequency.QuadPart / SEC_TO_MICRO) );</FONT>
<BR><FONT SIZE=2> }</FONT>
<BR><FONT SIZE=2> </FONT>
<BR><FONT SIZE=2>+uint64_t</FONT>
<BR><FONT SIZE=2>+cl_get_time_stamp_nsec( void )</FONT>
<BR><FONT SIZE=2>+{</FONT>
<BR><FONT SIZE=2>+ LARGE_INTEGER tick_count, frequency;</FONT>
<BR><FONT SIZE=2>+</FONT>
<BR><FONT SIZE=2>+ if( !QueryPerformanceFrequency( &frequency ) )</FONT>
<BR><FONT SIZE=2>+  return( 0 );</FONT>
<BR><FONT SIZE=2>+</FONT>
<BR><FONT SIZE=2>+ if( !QueryPerformanceCounter( &tick_count ) )</FONT>
<BR><FONT SIZE=2>+  return( 0 );</FONT>
<BR><FONT SIZE=2>+</FONT>
<BR><FONT SIZE=2>+ return( tick_count.QuadPart / (frequency.QuadPart / SEC_TO_NANO) );</FONT>
<BR><FONT SIZE=2>+}</FONT>
<BR><FONT SIZE=2>+</FONT>
<BR><FONT SIZE=2>+</FONT>
<BR><FONT SIZE=2>+uint64_t</FONT>
<BR><FONT SIZE=2>+cl_get_time_stamp_usec( void )</FONT>
<BR><FONT SIZE=2>+{</FONT>
<BR><FONT SIZE=2>+ LARGE_INTEGER tick_count, frequency;</FONT>
<BR><FONT SIZE=2>+</FONT>
<BR><FONT SIZE=2>+ if( !QueryPerformanceFrequency( &frequency ) )</FONT>
<BR><FONT SIZE=2>+  return( 0 );</FONT>
<BR><FONT SIZE=2>+</FONT>
<BR><FONT SIZE=2>+ if( !QueryPerformanceCounter( &tick_count ) )</FONT>
<BR><FONT SIZE=2>+  return( 0 );</FONT>
<BR><FONT SIZE=2>+</FONT>
<BR><FONT SIZE=2>+ return( tick_count.QuadPart / (frequency.QuadPart / SEC_TO_MICRO) );</FONT>
<BR><FONT SIZE=2>+}</FONT>
<BR><FONT SIZE=2>+</FONT>
<BR><FONT SIZE=2> uint32_t</FONT>
<BR><FONT SIZE=2> cl_get_time_stamp_sec( void )</FONT>
<BR><FONT SIZE=2> {</FONT>
<BR><FONT SIZE=2>  return( (uint32_t)(cl_get_time_stamp() / SEC_TO_MICRO) );</FONT>
<BR><FONT SIZE=2> }</FONT>
<BR><FONT SIZE=2>+</FONT>
<BR><FONT SIZE=2>+uint32_t</FONT>
<BR><FONT SIZE=2>+cl_get_frequency( void )</FONT>
<BR><FONT SIZE=2>+{</FONT>
<BR><FONT SIZE=2>+ LARGE_INTEGER frequency;</FONT>
<BR><FONT SIZE=2>+</FONT>
<BR><FONT SIZE=2>+ if( !QueryPerformanceFrequency( &frequency ) )</FONT>
<BR><FONT SIZE=2>+  return( 0 );</FONT>
<BR><FONT SIZE=2>+ return (uint32_t)(frequency.QuadPart);</FONT>
<BR><FONT SIZE=2>+}</FONT>
<BR><FONT SIZE=2>+</FONT>
<BR><FONT SIZE=2>--- C:\sleybo\OpenIB\inc\complib\cl_timer.h Sun Sep 04 09:42:22 2005</FONT>
<BR><FONT SIZE=2>+++ C:\sleybo\clean\inc\complib\cl_timer.h Tue Aug 23 14:19:46 2005</FONT>
<BR><FONT SIZE=2>@@ -351,6 +351,48 @@</FONT>
<BR><FONT SIZE=2> * Timer, cl_get_time_stamp_sec</FONT>
<BR><FONT SIZE=2> *********/</FONT>
<BR><FONT SIZE=2> </FONT>
<BR><FONT SIZE=2>+/****f* Component Library: Time Stamp/cl_get_time_stamp_sec</FONT>
<BR><FONT SIZE=2>+* NAME</FONT>
<BR><FONT SIZE=2>+* cl_get_time_stamp_nsec</FONT>
<BR><FONT SIZE=2>+*</FONT>
<BR><FONT SIZE=2>+* DESCRIPTION</FONT>
<BR><FONT SIZE=2>+* The cl_get_time_stamp_sec function returns the current time stamp in</FONT>
<BR><FONT SIZE=2>+* seconds since the system was booted.</FONT>
<BR><FONT SIZE=2>+*</FONT>
<BR><FONT SIZE=2>+* SYNOPSIS</FONT>
<BR><FONT SIZE=2>+*/</FONT>
<BR><FONT SIZE=2>+</FONT>
<BR><FONT SIZE=2>+CL_EXPORT uint64_t CL_API</FONT>
<BR><FONT SIZE=2>+cl_get_time_stamp_nsec( void );</FONT>
<BR><FONT SIZE=2>+/*</FONT>
<BR><FONT SIZE=2>+* RETURN VALUE</FONT>
<BR><FONT SIZE=2>+* Time elapsed, in nano seconds, since the system was booted.</FONT>
<BR><FONT SIZE=2>+*</FONT>
<BR><FONT SIZE=2>+* SEE ALSO</FONT>
<BR><FONT SIZE=2>+* Timer, cl_get_time_stamp</FONT>
<BR><FONT SIZE=2>+*********/</FONT>
<BR><FONT SIZE=2>+</FONT>
<BR><FONT SIZE=2>+/****f* Component Library: Time Stamp/cl_get_time_stamp_sec</FONT>
<BR><FONT SIZE=2>+* NAME</FONT>
<BR><FONT SIZE=2>+* cl_get_time_stamp_usec</FONT>
<BR><FONT SIZE=2>+*</FONT>
<BR><FONT SIZE=2>+* DESCRIPTION</FONT>
<BR><FONT SIZE=2>+* The cl_get_time_stamp_sec function returns the current time stamp in</FONT>
<BR><FONT SIZE=2>+* seconds since the system was booted.</FONT>
<BR><FONT SIZE=2>+*</FONT>
<BR><FONT SIZE=2>+* SYNOPSIS</FONT>
<BR><FONT SIZE=2>+*/</FONT>
<BR><FONT SIZE=2>+</FONT>
<BR><FONT SIZE=2>+CL_EXPORT uint64_t CL_API</FONT>
<BR><FONT SIZE=2>+cl_get_time_stamp_usec( void );</FONT>
<BR><FONT SIZE=2>+/*</FONT>
<BR><FONT SIZE=2>+* RETURN VALUE</FONT>
<BR><FONT SIZE=2>+* Time elapsed, in micro seconds, since the system was booted.</FONT>
<BR><FONT SIZE=2>+*</FONT>
<BR><FONT SIZE=2>+* SEE ALSO</FONT>
<BR><FONT SIZE=2>+* Timer, cl_get_time_stamp</FONT>
<BR><FONT SIZE=2>+*********/</FONT>
<BR><FONT SIZE=2>+</FONT>
<BR><FONT SIZE=2> </FONT>
<BR><FONT SIZE=2> /****f* Component Library: Time Stamp/cl_get_time_stamp_sec</FONT>
<BR><FONT SIZE=2> * NAME</FONT>
<BR><FONT SIZE=2>@@ -372,6 +414,26 @@</FONT>
<BR><FONT SIZE=2> * Timer, cl_get_time_stamp</FONT>
<BR><FONT SIZE=2> *********/</FONT>
<BR><FONT SIZE=2> </FONT>
<BR><FONT SIZE=2>+</FONT>
<BR><FONT SIZE=2>+/****f* Component Library: Time Stamp/cl_get_frequency</FONT>
<BR><FONT SIZE=2>+* NAME</FONT>
<BR><FONT SIZE=2>+* cl_get_frequency</FONT>
<BR><FONT SIZE=2>+*</FONT>
<BR><FONT SIZE=2>+* DESCRIPTION</FONT>
<BR><FONT SIZE=2>+* The cl_get_frequency function returns</FONT>
<BR><FONT SIZE=2>+*      the frequency of the high-resolution performance counter.</FONT>
<BR><FONT SIZE=2>+*</FONT>
<BR><FONT SIZE=2>+* SYNOPSIS</FONT>
<BR><FONT SIZE=2>+*/</FONT>
<BR><FONT SIZE=2>+CL_EXPORT uint32_t CL_API</FONT>
<BR><FONT SIZE=2>+cl_get_frequency( void );</FONT>
<BR><FONT SIZE=2>+/*</FONT>
<BR><FONT SIZE=2>+* RETURN VALUE</FONT>
<BR><FONT SIZE=2>+* the frequency of the high-resolution performance counter.</FONT>
<BR><FONT SIZE=2>+*</FONT>
<BR><FONT SIZE=2>+* SEE ALSO</FONT>
<BR><FONT SIZE=2>+* Timer, cl_get_time_stamp</FONT>
<BR><FONT SIZE=2>+*********/</FONT>
<BR><FONT SIZE=2> </FONT>
<BR><FONT SIZE=2> #ifdef __cplusplus</FONT>
<BR><FONT SIZE=2> } /* extern "C" */</FONT>
</P>

<P><FONT FACE="Arial" SIZE=2 COLOR="#000000"></FONT> 

</BODY>
</HTML>