XrdSysTimer.cc

Go to the documentation of this file.
00001 /******************************************************************************/
00002 /*                                                                            */
00003 /*                        X r d S y s T i m e r . c c                         */
00004 /*                                                                            */
00005 /* (c) 2004 by the Board of Trustees of the Leland Stanford, Jr., University  */
00006 /*       All Rights Reserved. See XrdInfo.cc for complete License Terms       */
00007 /*   Produced by Andrew Hanushevsky for Stanford University under contract    */
00008 /*              DE-AC03-76-SFO0515 with the Department of Energy              */
00009 /******************************************************************************/
00010 
00011 //          $Id: XrdSysTimer.cc 22437 2008-03-04 14:35:16Z rdm $
00012 
00013 const char *XrdSysTimerCVSID = "$Id: XrdSysTimer.cc 22437 2008-03-04 14:35:16Z rdm $";
00014 
00015 #ifndef WIN32
00016 #include <unistd.h>
00017 #else
00018 #include "XrdSys/XrdWin32.hh"
00019 #endif
00020 #include <errno.h>
00021 #include <time.h>
00022 #include <stdio.h>
00023 #include "XrdSys/XrdSysTimer.hh"
00024 
00025 /******************************************************************************/
00026 /*                            D e l t a _ T i m e                             */
00027 /******************************************************************************/
00028 
00029 struct timeval *XrdSysTimer::Delta_Time(struct timeval &tbeg)
00030 {
00031     gettimeofday(&LastReport, 0);
00032     LastReport.tv_sec  = LastReport.tv_sec  - tbeg.tv_sec;
00033     LastReport.tv_usec = LastReport.tv_usec - tbeg.tv_usec;
00034     if (LastReport.tv_usec < 0) {LastReport.tv_sec--; LastReport.tv_usec += 1000000;}
00035     return &LastReport;
00036 }
00037 
00038 /******************************************************************************/
00039 /*                              M i d n i g h t                               */
00040 /******************************************************************************/
00041 
00042 time_t XrdSysTimer::Midnight(time_t tnow)
00043 {
00044    struct tm midtime;
00045 
00046 // Compute time at midnight
00047 //
00048    if (!tnow) tnow = time(0);
00049    localtime_r((const time_t *) &tnow, &midtime);
00050    midtime.tm_hour = midtime.tm_min = midtime.tm_sec = 0;
00051    return mktime(&midtime);
00052 }
00053   
00054 /******************************************************************************/
00055 /*                                R e p o r t                                 */
00056 /******************************************************************************/
00057 
00058 unsigned long XrdSysTimer::Report()
00059 {
00060    unsigned long current_time;
00061 
00062 // Get current time of day 
00063 //
00064     gettimeofday(&LastReport, 0);
00065     current_time = (unsigned long)LastReport.tv_sec;
00066 
00067 // Calculate the time interval thus far
00068 //
00069    LastReport.tv_sec  = LastReport.tv_sec  - StopWatch.tv_sec;
00070    LastReport.tv_usec = LastReport.tv_usec - StopWatch.tv_usec;
00071    if (LastReport.tv_usec < 0) 
00072        {LastReport.tv_sec--; LastReport.tv_usec += 1000000;}
00073 
00074 // Return the current time
00075 //
00076     return current_time;
00077 }
00078 
00079 /******************************************************************************/
00080 
00081 unsigned long XrdSysTimer::Report(double &Total_Time)
00082 {
00083     unsigned long report_time = Report();
00084 
00085 // Add up the time as a double
00086 //
00087     Total_Time += (double)LastReport.tv_sec +
00088                  ((double)(LastReport.tv_usec/1000))/1000.0;
00089 
00090 // Return time
00091 //
00092    return report_time;
00093 }
00094 
00095 /******************************************************************************/
00096 
00097 unsigned long XrdSysTimer::Report(unsigned long &Total_Time)
00098 {
00099     unsigned long report_time = Report();
00100 
00101 // Add up the time as a 32-bit value to nearest microsecond (max = 24 days)
00102 //
00103     Total_Time += (unsigned long)LastReport.tv_sec*1000 +
00104                   (unsigned long)(LastReport.tv_usec/1000);
00105 
00106 // Return time
00107 //
00108    return report_time;
00109 }
00110 
00111 /******************************************************************************/
00112 
00113 unsigned long XrdSysTimer::Report(unsigned long long &Total_Time)
00114 {
00115     unsigned long report_time = Report();
00116 
00117 // Add up the time as a 64-bit value to nearest microsecond
00118 //
00119     Total_Time += (unsigned long long)LastReport.tv_sec*1000 +
00120                   (unsigned long long)(LastReport.tv_usec/1000);
00121 
00122 // Return time
00123 //
00124    return report_time;
00125 }
00126 
00127 /******************************************************************************/
00128 
00129 unsigned long XrdSysTimer::Report(struct timeval &Total_Time)
00130 {
00131     unsigned long report_time = Report();
00132 
00133 // Add the interval to the interval total time so far
00134 //
00135    Total_Time.tv_sec  += LastReport.tv_sec;
00136    Total_Time.tv_usec += LastReport.tv_usec;
00137    if (Total_Time.tv_usec > 1000000) {Total_Time.tv_sec++;
00138                                       Total_Time.tv_usec -= 1000000;}
00139 
00140 // Return time
00141 //
00142    return report_time;
00143 }
00144 
00145 /******************************************************************************/
00146 /*                                S n o o z e                                 */
00147 /******************************************************************************/
00148   
00149 void XrdSysTimer::Snooze(int sec)
00150 {
00151 #ifndef WIN32
00152  struct timespec naptime, waketime;
00153 
00154 // Calculate nano sleep time
00155 //
00156    naptime.tv_sec  =  sec;
00157    naptime.tv_nsec =  0;
00158 
00159 // Wait for a lsoppy number of seconds
00160 //
00161    while(nanosleep(&naptime, &waketime) && EINTR == errno)
00162         {naptime.tv_sec  =  waketime.tv_sec;
00163          naptime.tv_nsec =  waketime.tv_nsec;
00164         }
00165 #else
00166    ::Sleep(sec*1000);
00167 #endif
00168 }
00169 /******************************************************************************/
00170 /*                                 s 2 h m s                                  */
00171 /******************************************************************************/
00172   
00173 char *XrdSysTimer::s2hms(int sec, char *buff, int blen)
00174 {
00175    int hours, minutes;
00176 
00177    minutes = sec/60;
00178    sec     = sec%60;
00179    hours   = minutes/60;
00180    minutes = minutes%60;
00181 
00182    snprintf(buff, blen-1, "%d:%02d:%02d", hours, minutes, sec);
00183    buff[blen-1] = '\0';
00184    return buff;
00185 }
00186 
00187 /******************************************************************************/
00188 /*                                  W a i t                                   */
00189 /******************************************************************************/
00190   
00191 void XrdSysTimer::Wait(int mills)
00192 {
00193 #ifndef WIN32
00194  struct timespec naptime, waketime;
00195 
00196 // Calculate nano sleep time
00197 //
00198    naptime.tv_sec  =  mills/1000;
00199    naptime.tv_nsec = (mills%1000)*1000000;
00200 
00201 // Wait for exactly x milliseconds
00202 //
00203    while(nanosleep(&naptime, &waketime) && EINTR == errno)
00204         {naptime.tv_sec  =  waketime.tv_sec;
00205          naptime.tv_nsec =  waketime.tv_nsec;
00206         }
00207 #else
00208    ::Sleep(mills);
00209 #endif
00210 }

Generated on Tue Jul 5 14:47:03 2011 for ROOT_528-00b_version by  doxygen 1.5.1