#include <unitime.h>
Inheritance diagram for NLNET::_CUniTime:
Nevrax France
Definition at line 51 of file unitime.h.
Static Public Member Functions | |
TTime | getLocalTime () |
TTicks | getPerformanceTime () |
uint32 | getSecondsSince1970 () |
const char * | getStringUniTime (NLMISC::TTime ut) |
Return the time in a string format to be display. | |
const char * | getStringUniTime () |
Return the time in a string format to be display. | |
NLMISC::TTime | getUniTime () |
Return the time in millisecond. This time is the same on all computers at the same moment. | |
void | installServer (CCallbackServer *server) |
void | setUniTime (NLMISC::TTime uTime) |
void | setUniTime (NLMISC::TTime uTime, NLMISC::TTime lTime) |
used by the time service to set the universal time the first time | |
void | simulate () |
void | syncUniTimeFromServer (CCallbackClient *client) |
void | syncUniTimeFromService (CCallbackNetBase::TRecordingState rec=CCallbackNetBase::Off, const CInetAddress *addr=NULL) |
double | ticksToSecond (TTicks ticks) |
Static Public Attributes | |
bool | Sync = false |
Static Private Attributes | |
bool | _Simulate = false |
NLMISC::TTime | _SyncLocalTime = 0 |
NLMISC::TTime | _SyncUniTime = 0 |
|
get the time in millisecond. It's a local time, it means that the value is different on 2 differents computers. Use the CUniTime to get a universal time that is the same on all computers.
Definition at line 55 of file time_nl.cpp. References NLMISC::CTime::getPerformanceTime(), nlerror, and NLMISC::TTime. Referenced by NLAIAGENT::CAgentWatchTimer::attach(), NLSOUND::CAudioMixerUser::curTime(), NL3D::CWaterModel::doSimpleRender(), NLSOUND::CComplexSource::getTime(), loadForm(), NLSOUND::CComplexSource::onEvent(), NLSOUND::CComplexSource::onUpdate(), NLSOUND::CComplexSource::playStuf(), NLAIAGENT::CAgentManagerTimer::CRunTimer::run(), NLAIAGENT::CAgentClockTimer::runActivity(), NLAIAGENT::CAgentWatchTimer::runActivity(), NL3D::CWaterModel::setupMaterialNVertexShader(), NLMISC::CTime::ticksToSecond(), NLSOUND::CSoundDriverDSound::TimerCallback(), NLSOUND::CSoundDriverDSound::update(), NLSOUND::CAudioMixerUser::update(), and NLSOUND::CBackgroundSoundManager::updateBackgroundStatus().
00056 { 00057 #ifdef NL_OS_WINDOWS 00058 00059 static bool byperfcounter; 00060 static bool initdone = false; 00061 00062 // Initialization 00063 if ( ! initdone ) 00064 { 00065 byperfcounter = (getPerformanceTime() != 0); 00066 initdone = true; 00067 } 00068 00069 /* Retrieve time is ms 00070 * Why do we prefer getPerformanceTime() to timeGetTime() ? Because on one dual-processor Win2k 00071 * PC, we have noticed that timeGetTime() slows down when the client is running !!! 00072 */ 00073 00074 00075 /* Now we have noticed that on all WinNT4 PC the getPerformanceTime can give us value that 00076 * are less than previous 00077 */ 00078 00079 //if ( byperfcounter ) 00080 //{ 00081 // return (TTime)(ticksToSecond(getPerformanceTime()) * 1000.0f); 00082 //} 00083 //else 00084 //{ 00085 return timeGetTime(); 00086 //} 00087 00088 #elif defined (NL_OS_UNIX) 00089 00090 struct timeval tv; 00091 00092 if ( gettimeofday( &tv, NULL) == -1 ) 00093 { 00094 nlerror ("Cannot get time of day."); 00095 } 00096 return (TTime)tv.tv_sec * (TTime)1000 + (TTime)tv.tv_usec / (TTime)1000; 00097 00098 #endif 00099 } |
|
get the time in processor ticks. Use it for profile purpose. Only implemented under windows for the time. If the performance time is not supported on this hardware, it returns 0. Definition at line 105 of file time_nl.cpp. References nlwarning, NLMISC::TTicks, and x. Referenced by NLMISC::CTime::getLocalTime(), NLMISC::CSystemInfo::getProcessorFrequency(), NLAIAGENT::CAgentScript::run(), NLAIAGENT::CAgentScript::sendMessage(), and NLMISC::CTime::ticksToSecond().
00106 { 00107 #ifdef NL_OS_WINDOWS 00108 LARGE_INTEGER ret; 00109 if (QueryPerformanceCounter (&ret)) 00110 return ret.QuadPart; 00111 else 00112 return 0; 00113 #else // NL_OS_WINDOWS 00114 00115 #ifdef HAVE_X86 00116 unsigned long long int x; 00117 __asm__ volatile (".byte 0x0f, 0x31" : "=A" (x)); 00118 return x; 00119 #else // HAVE_X86 00120 static bool firstWarn = true; 00121 if (firstWarn) 00122 { 00123 nlwarning ("TTicks CTime::getPerformanceTime () is not implemented for your processor, returning 0"); 00124 firstWarn = false; 00125 } 00126 return 0; 00127 #endif // HAVE_X86 00128 00129 #endif // NL_OS_WINDOWS 00130 } |
|
returns the number of second since midnight (00:00:00), January 1, 1970, coordinated universal time, according to the system clock. This values is the same on all computer if computers are synchronized (with NTP for example). Definition at line 45 of file time_nl.cpp. References uint32. Referenced by NLAINIMAT::CMHiCSagent::CTemporaryPriority::CTemporaryPriority(), and NLAINIMAT::CMHiCSagent::learningComputation().
00046 { 00047 return (uint32) time (NULL); 00048 } |
|
Return the time in a string format to be display.
Definition at line 96 of file unitime.cpp. References nlstop, s, NLMISC::smprintf(), NLMISC::TTime, uint, and uint32.
00097 { 00098 nlstop; 00099 static char str[512]; 00100 00101 uint32 ms = (uint32) (ut % 1000); // time in ms 1000ms dans 1s 00102 ut /= 1000; 00103 00104 uint32 s = (uint32) (ut % 60); // time in seconds 60s dans 1mn 00105 ut /= 60; 00106 00107 uint32 m = (uint32) (ut % 60); // time in minutes 60m dans 1h 00108 ut /= 60; 00109 00110 uint32 h = (uint32) (ut % 9); // time in hours 9h dans 1j 00111 ut /= 9; 00112 00113 uint32 day = (uint32) (ut % (8*4)); // time in days 8day dans 1month 00114 ut /= 8; 00115 00116 uint32 week = (uint32) (ut % 4); // time in weeks 4week dans 1month 00117 ut /= 4; 00118 00119 uint32 month = (uint32) (ut % 12); // time in months 12month dans 1year 00120 ut /= 12; 00121 00122 uint year = (uint32) ut; // time in years 00123 00124 smprintf (str, 512, "%02d/%02d/%04d (week %d) %02d:%02d:%02d.%03d", day+1, month+1, year+1, week+1, h, m, s, ms); 00125 return str; 00126 } |
|
Return the time in a string format to be display.
Definition at line 89 of file unitime.cpp. References nlstop.
00090 { 00091 nlstop; 00092 return getStringUniTime(_CUniTime::getUniTime()); 00093 } |
|
Return the time in millisecond. This time is the same on all computers at the same moment.
Definition at line 76 of file unitime.cpp. References nlstop, and NLMISC::TTime.
00077 { 00078 nlstop; 00079 return 0; 00080 /* if (!Sync) 00081 { 00082 nlerror ("called getUniTime before calling syncUniTimeFromServer"); 00083 } 00084 return getLocalTime () - (_SyncLocalTime - _SyncUniTime); 00085 */ 00086 } |
|
Call this function in the init part of the front end service to enable time syncro between shard and clients. Definition at line 280 of file unitime.cpp. References NLNET::CCallbackNetBase::addCallbackArray(), nlassert, nlstop, and NLNET::ServerTimeServiceCallbackArray.
00281 { 00282 nlstop; 00283 static bool alreadyAddedCallback = false; 00284 nlassert (server != NULL); 00285 nlassert (!alreadyAddedCallback); 00286 00287 server->addCallbackArray (ServerTimeServiceCallbackArray, sizeof (ServerTimeServiceCallbackArray) / sizeof (ServerTimeServiceCallbackArray[0])); 00288 alreadyAddedCallback = true; 00289 } |
|
Definition at line 68 of file unitime.cpp. References nlstop, and NLMISC::TTime.
00069 { 00070 nlstop; 00071 // setUniTime (uTime, getLocalTime ()); 00072 } |
|
used by the time service to set the universal time the first time
Definition at line 49 of file unitime.cpp. References nlstop, and NLMISC::TTime.
00050 { 00051 nlstop; 00052 /* if (Sync) 00053 { 00054 TTime lt = getLocalTime (); 00055 TTime delta = uTime - lTime + _SyncLocalTime - _SyncUniTime; 00056 00057 nlinfo ("_CUniTime::setUniTime(%"NL_I64"d, %"NL_I64"d): Resyncing delta %"NL_I64"dms",uTime,lTime,delta); 00058 } 00059 else 00060 { 00061 nlinfo ("_CUniTime::setUniTime(%"NL_I64"d, %"NL_I64"d)",uTime,lTime); 00062 Sync = true; 00063 } 00064 _SyncUniTime = uTime; 00065 _SyncLocalTime = lTime; 00066 */} |
|
Call this method before to prevent syncUniTimeFromService() from real synchronization: syncUniTimeFromService() will still communicate with the time service, as usual, but the local time will not be synchronized. Definition at line 96 of file unitime.h. References _Simulate, and nlstop.
|
|
Call this functions in the init part of the client side to synchronize between client and shard. client is the connection between the client and the front end. The connection must be established before calling this function. Definition at line 314 of file unitime.cpp. References nlstop.
00315 { 00316 nlstop; 00317 /***************************************************************/ 00318 /******************* THE FOLLOWING CODE IS COMMENTED OUT *******/ 00319 /*************************************************************** 00320 00321 static bool alreadyAddedCallback = false; 00322 nlassert (client != NULL); 00323 00324 if (!alreadyAddedCallback) 00325 { 00326 client->addCallbackArray (ClientUniTimeCallbackArray, sizeof (ClientUniTimeCallbackArray) / sizeof (ClientUniTimeCallbackArray[0])); 00327 alreadyAddedCallback = true; 00328 } 00329 00330 sint attempt = 0; 00331 TTime bestdelta = 60000; // 1 minute 00332 00333 if (!client->connected ()) goto error; 00334 00335 while (attempt < 10) 00336 { 00337 CMessage msgout (client->getSIDA(), "AUT"); 00338 00339 if (!client->connected()) goto error; 00340 00341 // send the message 00342 client->send (msgout); 00343 00344 // before time 00345 TTime before = CTime::getLocalTime (); 00346 00347 // receive the answer 00348 GetClientUniversalTime = false; 00349 while (!GetClientUniversalTime) 00350 { 00351 if (!client->connected()) goto error; 00352 00353 client->update (); 00354 } 00355 00356 TTime after = CTime::getLocalTime (), delta = after - before; 00357 00358 if (delta < 10 || delta < bestdelta) 00359 { 00360 bestdelta = delta; 00361 00362 _CUniTime::setUniTime (GetClientUniversalTimeUniTime, (before+after)/2); 00363 00364 if (delta < 10) break; 00365 } 00366 attempt++; 00367 } 00368 client->disconnect (); 00369 nlinfo ("Universal time is %"NL_I64"dms with a mean error of %"NL_I64"dms", _CUniTime::getUniTime(), bestdelta/2); 00370 return; 00371 error: 00372 nlwarning ("there's no connection or lost or can't synchronize universal time"); 00373 ***************************************************************/ 00374 } |
|
You need to call this function before calling getUniTime or an assert will occured. This function will connect to the time service and synchronize your computer. This function assumes that all services run on server that are time synchronized with NTP for example. If addr is NULL, the function will connect to the Time Service via the Naming Service. In this case, the CNamingClient must be connected to a Naming Service. This function can be called *ONLY* by services that are inside of the shard. Don't use it for a client or a service outside of the shard. Definition at line 157 of file unitime.cpp.
00158 { 00159 nlstop; 00160 /***************************************************************/ 00161 /******************* THE FOLLOWING CODE IS COMMENTED OUT *******/ 00162 /*************************************************************** 00163 TTime deltaAdjust, lt; 00164 uint32 firstsecond, nextsecond; 00165 TTime before, after, delta; 00166 00167 // create a message with type in the full text format 00168 CMessage msgout ("AUT"); 00169 CCallbackClient server( rec, "TS.nmr" ); 00170 server.addCallbackArray (UniTimeCallbackArray, sizeof (UniTimeCallbackArray) / sizeof (UniTimeCallbackArray[0])); 00171 00172 if (addr == NULL) 00173 { 00174 CNamingClient::lookupAndConnect ("TS", server); 00175 } 00176 else 00177 { 00178 server.connect (*addr); 00179 } 00180 00181 if (!server.connected()) goto error; 00182 00183 server.send (msgout); 00184 00185 // before time 00186 before = CTime::getLocalTime (); 00187 00188 // receive the answer 00189 GetUniversalTime = false; 00190 while (!GetUniversalTime) 00191 { 00192 if (!server.connected()) goto error; 00193 00194 server.update (); 00195 00196 nlSleep( 0 ); 00197 } 00198 00199 // after, before and delta is not used. It's only for information purpose. 00200 after = CTime::getLocalTime (); 00201 delta = after - before; 00202 00203 nlinfo ("_CUniTime::syncUniTimeFromService(): ping:%"NL_I64"dms, time:%ds, unitime:%"NL_I64"dms", delta, GetUniversalTimeSecondsSince1970, GetUniversalTimeUniTime); 00204 00205 // <-- from here to the "-->" comment, the block must be executed in less than one second or an infinite loop occurs 00206 00207 // get the second 00208 firstsecond = CTime::getSecondsSince1970 (); 00209 nextsecond = firstsecond+1; 00210 00211 // wait the next start of the second (take 100% of CPU to be more accurate) 00212 while (nextsecond != CTime::getSecondsSince1970 ()) 00213 nlassert (CTime::getSecondsSince1970 () <= nextsecond); 00214 00215 // --> 00216 00217 // get the local time of the beginning of the next second 00218 lt = CTime::getLocalTime (); 00219 00220 if ( ! _Simulate ) 00221 { 00222 if (abs((sint32)((TTime)nextsecond - (TTime)GetUniversalTimeSecondsSince1970)) > 10) 00223 { 00224 nlerror ("the time delta (between me and the Time Service) is too big (more than 10s), servers aren't NTP synchronized"); 00225 goto error; 00226 } 00227 00228 // compute the delta between the other side and our side number of second since 1970 00229 deltaAdjust = ((TTime) nextsecond - (TTime) GetUniversalTimeSecondsSince1970) * 1000; 00230 00231 // adjust the unitime to the current localtime 00232 GetUniversalTimeUniTime += deltaAdjust; 00233 00234 nlinfo ("_CUniTime::syncUniTimeFromService(): rtime:%ds, runitime:%"NL_I64"ds, rlocaltime:%"NL_I64"d, deltaAjust:%"NL_I64"dms", nextsecond, GetUniversalTimeUniTime, lt, deltaAdjust); 00235 } 00236 else 00237 { 00238 nlinfo ("_CUniTime::syncUniTimeFromService(): runitime:%"NL_I64"ds, rlocaltime:%"NL_I64"d", GetUniversalTimeUniTime, lt); 00239 } 00240 00241 _CUniTime::setUniTime (GetUniversalTimeUniTime, lt); 00242 00243 server.disconnect (); 00244 return; 00245 00246 error: 00247 nlerror ("Time Service is not found, lost or can't synchronize universal time"); 00248 ***************************************************************/ 00249 00250 } |
|
convert a ticks count into second. If the performance time is not supported on this hardware, it returns 0.0. Definition at line 143 of file time_nl.cpp. References NLMISC::CTime::getLocalTime(), NLMISC::CTime::getPerformanceTime(), sint64, NLMISC::TTicks, and NLMISC::TTime. Referenced by NL3D::CScene::render().
00144 { 00145 #ifdef NL_OS_WINDOWS 00146 LARGE_INTEGER ret; 00147 if (QueryPerformanceFrequency(&ret)) 00148 { 00149 return (double)(sint64)ticks/(double)ret.QuadPart; 00150 } 00151 else 00152 #endif // NL_OS_WINDOWS 00153 { 00154 static bool benchFrequency = true; 00155 static sint64 freq = 0; 00156 if (benchFrequency) 00157 { 00158 // try to have an estimation of the cpu frequency 00159 00160 TTicks tickBefore = getPerformanceTime (); 00161 TTicks tickAfter = tickBefore; 00162 TTime timeBefore = getLocalTime (); 00163 TTime timeAfter = timeBefore; 00164 while (true) 00165 { 00166 if (timeAfter - timeBefore > 1000) 00167 break; 00168 timeAfter = getLocalTime (); 00169 tickAfter = getPerformanceTime (); 00170 } 00171 00172 TTime timeDelta = timeAfter - timeBefore; 00173 TTicks tickDelta = tickAfter - tickBefore; 00174 00175 freq = 1000 * tickDelta / timeDelta; 00176 benchFrequency = false; 00177 } 00178 00179 return (double)(sint64)ticks/(double)freq; 00180 } 00181 } |
|
Definition at line 44 of file unitime.cpp. Referenced by simulate(). |
|
Definition at line 43 of file unitime.cpp. |
|
Definition at line 42 of file unitime.cpp. |
|
Definition at line 46 of file unitime.cpp. |