int* mysig = NULL;
-/* Burlex: Moved from exitcodes.h -- due to duplicate symbols */
+/* Moved from exitcodes.h -- due to duplicate symbols -- Burlex
+ * XXX this is a bit ugly. -- w00t
+ */
const char* ExitCodes[] =
{
"No error", /* 0 */
rlimit rl;
if (getrlimit(RLIMIT_CORE, &rl) == -1)
{
- this->Log(DEFAULT,"Failed to getrlimit()!");
+ this->Logs->Log("STARTUP",DEFAULT,"Failed to getrlimit()!");
return false;
}
else
{
rl.rlim_cur = rl.rlim_max;
if (setrlimit(RLIMIT_CORE, &rl) == -1)
- this->Log(DEFAULT,"setrlimit() failed, cannot increase coredump size.");
+ this->Logs->Log("STARTUP",DEFAULT,"setrlimit() failed, cannot increase coredump size.");
}
return true;
else
{
printf("Failed to write PID-file '%s', exiting.\n",fname.c_str());
- this->Log(DEFAULT,"Failed to write PID-file '%s', exiting.",fname.c_str());
+ this->Logs->Log("STARTUP",DEFAULT,"Failed to write PID-file '%s', exiting.",fname.c_str());
Exit(EXIT_STATUS_PID);
}
}
SE = SEF->Create(this);
delete SEF;
+
+ ThreadEngineFactory* tef = new ThreadEngineFactory();
+ this->Threads = tef->Create(this);
+ delete tef;
+
this->s_signal = 0;
// Create base manager classes early, so nothing breaks
if (!ServerConfig::FileExists(this->ConfigFileName))
{
printf("ERROR: Cannot open config file: %s\nExiting...\n", this->ConfigFileName);
- this->Log(DEFAULT,"Unable to open config file %s", this->ConfigFileName);
+ this->Logs->Log("STARTUP",DEFAULT,"Unable to open config file %s", this->ConfigFileName);
Exit(EXIT_STATUS_CONFIG);
}
SE->RecoverFromFork();
- /* Read config, pass 0. At the end if this pass,
- * the Config->IncludeFiles is populated, we call
- * Config->StartDownloads to initialize the downlaods of all
- * these files.
+ /* During startup we don't actually initialize this
+ * in the thread engine.
*/
- Config->Read(true, NULL, 0);
- Config->DoDownloads();
- /* We have all the files we can get, initiate pass 1 */
- Config->Read(true, NULL, 1);
+ this->ConfigThread = new ConfigReaderThread(this, true, NULL);
+ ConfigThread->Run();
+ delete ConfigThread;
+ this->ConfigThread = NULL;
+
+ this->Res = new DNS(this);
this->AddServerName(Config->ServerName);
* For an explanation as to exactly how this works, and why it works this way, see GetUID().
* -- w00t
*/
- if (*Config->sid)
- {
- }
- else
+ if (!*Config->sid)
{
// Generate one
size_t sid = 0;
printf("\n");
- /*this->Modules->LoadAll();*/
+ this->Modules->LoadAll();
/* Just in case no modules were loaded - fix for bug #101 */
this->BuildISupport();
InitializeDisabledCommands(Config->DisabledCommands, this);
- if ((Config->ports.size() == 0) && (found_ports > 0))
+ /*if ((Config->ports.size() == 0) && (found_ports > 0))
{
printf("\nERROR: I couldn't bind any ports! Are you sure you didn't start InspIRCd twice?\n");
Logs->Log("STARTUP", DEFAULT,"ERROR: I couldn't bind any ports! Something else is bound to those ports!");
Exit(EXIT_STATUS_BIND);
- }
+ }*/
if (Config->ports.size() != (unsigned int)found_ports)
{
static char window_title[100];
#endif
+ /* Check if there is a config thread which has finished executing but has not yet been freed */
+ if (this->ConfigThread && this->ConfigThread->GetExitFlag())
+ {
+ /* Rehash has completed */
+ this->Logs->Log("CONFIG",DEBUG,"Detected ConfigThread exiting, tidying up...");
+
+ /* IMPORTANT: This delete may hang if you fuck up your thread syncronization.
+ * It will hang waiting for the ConfigThread to 'join' to avoid race conditons,
+ * until the other thread is completed.
+ */
+ delete ConfigThread;
+ ConfigThread = NULL;
+
+ /* These are currently not known to be threadsafe, so they are executed outside
+ * of the thread. It would be pretty simple to move them to the thread Run method
+ * once they are known threadsafe with all the correct mutexes in place.
+ *
+ * XXX: The order of these is IMPORTANT, do not reorder them without testing
+ * thoroughly!!!
+ */
+ this->XLines->CheckELines();
+ this->XLines->ApplyLines();
+ this->Res->Rehash();
+ this->ResetMaxBans();
+ InitializeDisabledCommands(Config->DisabledCommands, this);
+ FOREACH_MOD_I(this, I_OnRehash, OnRehash(Config->RehashUser, Config->RehashParameter));
+ this->BuildISupport();
+ }
+
/* time() seems to be a pretty expensive syscall, so avoid calling it too much.
* Once per loop iteration is pleanty.
*/
{
if (TIME < OLDTIME)
{
- SNO->WriteToSnoMask('A', "\002EH?!\002 -- Time is flowing BACKWARDS in this dimension! Clock drifted backwards %d secs.",abs(OLDTIME-TIME));
+ SNO->WriteToSnoMask('A', "\002EH?!\002 -- Time is flowing BACKWARDS in this dimension! Clock drifted backwards %d secs.",OLDTIME-TIME);
}
if ((TIME % 3600) == 0)
{
for (std::map<BufferedSocket*,BufferedSocket*>::iterator x = SocketCull.begin(); x != SocketCull.end(); ++x)
{
- Log(DEBUG,"Cull socket");
+ this->Logs->Log("MISC",DEBUG,"Cull socket");
SE->DelFd(x->second);
x->second->Close();
delete x->second;