summaryrefslogtreecommitdiff
path: root/src/inspircd.cpp
diff options
context:
space:
mode:
authordanieldg <danieldg@e03df62e-2008-0410-955e-edbf42e46eb7>2010-01-18 19:36:41 +0000
committerdanieldg <danieldg@e03df62e-2008-0410-955e-edbf42e46eb7>2010-01-18 19:36:41 +0000
commit7e46119759b7099c38f543bd38d0186b9806542f (patch)
treeb31264c454e26566b2e70c2794b89d77f4e28c44 /src/inspircd.cpp
parent42592c0083505777e8fb8e4bf09182528229a787 (diff)
Remove excessive gettimeofday system calls
git-svn-id: http://svn.inspircd.org/repository/trunk/inspircd@12293 e03df62e-2008-0410-955e-edbf42e46eb7
Diffstat (limited to 'src/inspircd.cpp')
-rw-r--r--src/inspircd.cpp61
1 files changed, 30 insertions, 31 deletions
diff --git a/src/inspircd.cpp b/src/inspircd.cpp
index 8cead1c87..47f743df2 100644
--- a/src/inspircd.cpp
+++ b/src/inspircd.cpp
@@ -340,7 +340,8 @@ InspIRCd::InspIRCd(int argc, char** argv) :
this->ConfigThread = NULL;
// Initialise TIME
- this->TIME = this->OLDTIME = this->startup_time = time(NULL);
+ clock_gettime(CLOCK_REALTIME, &TIME);
+ this->startup_time = TIME.tv_sec;
// This must be created first, so other parts of Insp can use it while starting up
this->Logs = new LogManager;
@@ -375,7 +376,7 @@ InspIRCd::InspIRCd(int argc, char** argv) :
this->Config->cmdline.argv = argv;
this->Config->cmdline.argc = argc;
- srand(this->TIME);
+ srand(TIME.tv_nsec ^ TIME.tv_sec);
struct option longopts[] =
{
@@ -685,6 +686,11 @@ InspIRCd::InspIRCd(int argc, char** argv) :
this->WritePID(Config->PID);
}
+void InspIRCd::UpdateTime()
+{
+ clock_gettime(CLOCK_REALTIME, &TIME);
+}
+
int InspIRCd::Run()
{
/* See if we're supposed to be running the test suite rather than entering the mainloop */
@@ -695,6 +701,9 @@ int InspIRCd::Run()
Exit(0);
}
+ UpdateTime();
+ time_t OLDTIME = TIME.tv_sec;
+
while (true)
{
#ifndef WIN32
@@ -718,53 +727,48 @@ int InspIRCd::Run()
ConfigThread = NULL;
}
- /* time() seems to be a pretty expensive syscall, so avoid calling it too much.
- * Once per loop iteration is pleanty.
- */
- OLDTIME = TIME;
- TIME = time(NULL);
+ UpdateTime();
/* Run background module timers every few seconds
* (the docs say modules shouldnt rely on accurate
* timing using this event, so we dont have to
* time this exactly).
*/
- if (TIME != OLDTIME)
+ if (TIME.tv_sec != OLDTIME)
{
+ OLDTIME = TIME.tv_sec;
+#ifndef WIN32
+ getrusage(RUSAGE_SELF, &ru);
+ stats->LastSampled = TIME;
+ stats->LastCPU = ru.ru_utime;
+#else
+ WindowsIPC->Check();
+#endif
+
/* Allow a buffer of two seconds drift on this so that ntpdate etc dont harass admins */
- if (TIME < OLDTIME - 2)
+ if (TIME.tv_sec < OLDTIME - 2)
{
- SNO->WriteToSnoMask('d', "\002EH?!\002 -- Time is flowing BACKWARDS in this dimension! Clock drifted backwards %lu secs.", (unsigned long)OLDTIME-TIME);
+ SNO->WriteToSnoMask('d', "\002EH?!\002 -- Time is flowing BACKWARDS in this dimension! Clock drifted backwards %lu secs.", (unsigned long)OLDTIME-TIME.tv_sec);
}
- else if (TIME > OLDTIME + 2)
+ else if (TIME.tv_sec > OLDTIME + 2)
{
- SNO->WriteToSnoMask('d', "\002EH?!\002 -- Time is jumping FORWARDS! Clock skipped %lu secs.", (unsigned long)TIME - OLDTIME);
+ SNO->WriteToSnoMask('d', "\002EH?!\002 -- Time is jumping FORWARDS! Clock skipped %lu secs.", (unsigned long)TIME.tv_sec - OLDTIME);
}
- if ((TIME % 3600) == 0)
+ if ((TIME.tv_sec % 3600) == 0)
{
this->RehashUsersAndChans();
FOREACH_MOD(I_OnGarbageCollect, OnGarbageCollect());
}
- Timers->TickTimers(TIME);
+ Timers->TickTimers(TIME.tv_sec);
this->DoBackgroundUserStuff();
- if ((TIME % 5) == 0)
+ if ((TIME.tv_sec % 5) == 0)
{
- FOREACH_MOD(I_OnBackgroundTimer,OnBackgroundTimer(TIME));
+ FOREACH_MOD(I_OnBackgroundTimer,OnBackgroundTimer(TIME.tv_sec));
SNO->FlushSnotices();
}
-#ifndef WIN32
- /* Same change as in cmd_stats.cpp, use RUSAGE_SELF rather than '0' -- Om */
- if (!getrusage(RUSAGE_SELF, &ru))
- {
- gettimeofday(&this->stats->LastSampled, NULL);
- this->stats->LastCPU = ru.ru_utime;
- }
-#else
- WindowsIPC->Check();
-#endif
}
/* Call the socket engine to wait on the active
@@ -808,11 +812,6 @@ bool InspIRCd::AllModulesReportReady(LocalUser* user)
return (res == MOD_RES_PASSTHRU);
}
-time_t InspIRCd::Time()
-{
- return TIME;
-}
-
void InspIRCd::SetSignal(int signal)
{
*mysig = signal;