00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
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
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
00040
00041
00042 time_t XrdSysTimer::Midnight(time_t tnow)
00043 {
00044 struct tm midtime;
00045
00046
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
00056
00057
00058 unsigned long XrdSysTimer::Report()
00059 {
00060 unsigned long current_time;
00061
00062
00063
00064 gettimeofday(&LastReport, 0);
00065 current_time = (unsigned long)LastReport.tv_sec;
00066
00067
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
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
00086
00087 Total_Time += (double)LastReport.tv_sec +
00088 ((double)(LastReport.tv_usec/1000))/1000.0;
00089
00090
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
00102
00103 Total_Time += (unsigned long)LastReport.tv_sec*1000 +
00104 (unsigned long)(LastReport.tv_usec/1000);
00105
00106
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
00118
00119 Total_Time += (unsigned long long)LastReport.tv_sec*1000 +
00120 (unsigned long long)(LastReport.tv_usec/1000);
00121
00122
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
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
00141
00142 return report_time;
00143 }
00144
00145
00146
00147
00148
00149 void XrdSysTimer::Snooze(int sec)
00150 {
00151 #ifndef WIN32
00152 struct timespec naptime, waketime;
00153
00154
00155
00156 naptime.tv_sec = sec;
00157 naptime.tv_nsec = 0;
00158
00159
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
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
00189
00190
00191 void XrdSysTimer::Wait(int mills)
00192 {
00193 #ifndef WIN32
00194 struct timespec naptime, waketime;
00195
00196
00197
00198 naptime.tv_sec = mills/1000;
00199 naptime.tv_nsec = (mills%1000)*1000000;
00200
00201
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 }