00001
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021 #ifndef XAPIAN_INCLUDED_REALTIME_H
00022 #define XAPIAN_INCLUDED_REALTIME_H
00023
00024 #include <cmath>
00025 #include <ctime>
00026 #include "safeerrno.h"
00027 #include "safeunistd.h"
00028
00029 #ifndef __WIN32__
00030 # ifdef HAVE_FTIME
00031 # include <sys/timeb.h>
00032 # endif
00033 # ifdef HAVE_GETTIMEOFDAY
00034 # include <sys/time.h>
00035 # endif
00036 #else
00037 # include <sys/types.h>
00038 # include <sys/timeb.h>
00039 extern void xapian_sleep_milliseconds(unsigned int millisecs);
00040 #endif
00041
00042 namespace RealTime {
00043
00045 inline double now() {
00046 #ifndef __WIN32__
00047
00048 # ifdef HAVE_GETTIMEOFDAY
00049 struct timeval tv;
00050 if (usual(gettimeofday(&tv, NULL) == 0))
00051 return tv.tv_sec + (tv.tv_usec * 1e-6);
00052 return double(std::time(NULL));
00053 # elif defined HAVE_FTIME
00054 struct timeb tp;
00055 # ifdef FTIME_RETURNS_VOID
00056 ftime(&tp);
00057 # else
00058 if (rare(ftime(&tp) != 0))
00059 return double(std::time(NULL));
00060 # endif
00061 return tp.time + (tp.millitm * 1e-3);
00062 # else
00063 return double(std::time(NULL));
00064 # endif
00065 #else
00066 struct __timeb64 tp;
00067 _ftime64(&tp);
00068 return tp.time + tp.millitm * 1e-3;
00069 #endif
00070 }
00071
00077 inline double end_time(double timeout) {
00078 return (timeout == 0.0 ? timeout : timeout + now());
00079 }
00080
00082 inline void sleep(double t) {
00083 #ifndef __WIN32__
00084 double delta;
00085 struct timeval tv;
00086 do {
00087 delta = RealTime::now() - t;
00088 if (delta <= 0.0)
00089 return;
00090 tv.tv_sec = long(delta);
00091 tv.tv_usec = long(std::fmod(delta, 1.0) * 1e6);
00092 } while (select(0, NULL, NULL, NULL, &tv) < 0 && errno == EINTR);
00093 #else
00094 double delta = RealTime::now() - t;
00095 if (delta <= 0.0)
00096 return;
00097 while (rare(t > 4294967.0)) {
00098 xapian_sleep_milliseconds(4294967000u);
00099 t -= 4294967.0;
00100 }
00101 xapian_sleep_milliseconds(unsigned(t * 1000.0));
00102 #endif
00103 }
00104
00105 }
00106
00107 #endif // XAPIAN_INCLUDED_REALTIME_H