]> git.netwichtig.de Git - user/henk/code/inspircd.git/blobdiff - src/modules/m_spanningtree/treeserver.cpp
Merge pull request #1254 from genius3000/insp20+fixPIstatusmsgs
[user/henk/code/inspircd.git] / src / modules / m_spanningtree / treeserver.cpp
index 38d91f54cbf695f43b4e81716bde634d17c2c1bd..493b05ebf78f6dda096e3c8b3ab04f86200dc16e 100644 (file)
@@ -1,16 +1,25 @@
-/*       +------------------------------------+
- *       | Inspire Internet Relay Chat Daemon |
- *       +------------------------------------+
+/*
+ * InspIRCd -- Internet Relay Chat Daemon
  *
- *  InspIRCd: (C) 2002-2009 InspIRCd Development Team
- * See: http://wiki.inspircd.org/Credits
+ *   Copyright (C) 2009 Daniel De Graaf <danieldg@inspircd.org>
+ *   Copyright (C) 2007-2008 Craig Edwards <craigedwards@brainbox.cc>
+ *   Copyright (C) 2008 Robin Burchell <robin+git@viroteck.net>
+ *   Copyright (C) 2007 Dennis Friis <peavey@inspircd.org>
  *
- * This program is free but copyrighted software; see
- *            the file COPYING for details.
+ * This file is part of InspIRCd.  InspIRCd is free software: you can
+ * redistribute it and/or modify it under the terms of the GNU General Public
+ * License as published by the Free Software Foundation, version 2.
  *
- * ---------------------------------------------------
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+ * FOR A PARTICULAR PURPOSE.  See the GNU General Public License for more
+ * details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program.  If not, see <http://www.gnu.org/licenses/>.
  */
 
+
 #include "inspircd.h"
 #include "socket.h"
 #include "xline.h"
@@ -59,9 +68,7 @@ TreeServer::TreeServer(SpanningTreeUtilities* Util, std::string Name, std::strin
        Warned = false;
        rtt = 0;
 
-       timeval t;
-       gettimeofday(&t, NULL);
-       long ts = (t.tv_sec * 1000) + (t.tv_usec / 1000);
+       long ts = ServerInstance->Time() * 1000 + (ServerInstance->Time_ns() / 1000000);
        this->StartBurst = ts;
        ServerInstance->Logs->Log("m_spanningtree",DEBUG, "Started bursting at time %lu", ts);
 
@@ -121,7 +128,7 @@ TreeServer::TreeServer(SpanningTreeUtilities* Util, std::string Name, std::strin
        SetID(id);
 }
 
-std::string& TreeServer::GetID()
+const std::string& TreeServer::GetID()
 {
        return sid;
 }
@@ -142,9 +149,7 @@ void TreeServer::FinishBurst()
 {
        FinishBurstInternal();
        ServerInstance->XLines->ApplyLines();
-       timeval t;
-       gettimeofday(&t, NULL);
-       long ts = (t.tv_sec * 1000) + (t.tv_usec / 1000);
+       long ts = ServerInstance->Time() * 1000 + (ServerInstance->Time_ns() / 1000000);
        unsigned long bursttime = ts - this->StartBurst;
        ServerInstance->SNO->WriteToSnoMask(Parent == Utils->TreeRoot ? 'l' : 'L', "Received end of netburst from \2%s\2 (burst time: %lu %s)",
                ServerName.c_str(), (bursttime > 10000 ? bursttime / 1000 : bursttime), (bursttime > 10000 ? "secs" : "msecs"));
@@ -221,12 +226,12 @@ std::string TreeServer::GetName()
        return ServerName.c_str();
 }
 
-std::string TreeServer::GetDesc()
+const std::string& TreeServer::GetDesc()
 {
        return ServerDesc;
 }
 
-std::string TreeServer::GetVersion()
+const std::string& TreeServer::GetVersion()
 {
        return VersionString;
 }
@@ -316,13 +321,11 @@ void TreeServer::AddChild(TreeServer* Child)
 
 bool TreeServer::DelChild(TreeServer* Child)
 {
-       for (std::vector<TreeServer*>::iterator a = Children.begin(); a != Children.end(); a++)
+       std::vector<TreeServer*>::iterator it = std::find(Children.begin(), Children.end(), Child);
+       if (it != Children.end())
        {
-               if (*a == Child)
-               {
-                       Children.erase(a);
-                       return true;
-               }
+               Children.erase(it);
+               return true;
        }
        return false;
 }
@@ -333,21 +336,17 @@ bool TreeServer::DelChild(TreeServer* Child)
  */
 bool TreeServer::Tidy()
 {
-       bool stillchildren = true;
-       while (stillchildren)
+       while (1)
        {
-               stillchildren = false;
-               for (std::vector<TreeServer*>::iterator a = Children.begin(); a != Children.end(); a++)
-               {
-                       TreeServer* s = (TreeServer*)*a;
-                       s->Tidy();
-                       Children.erase(a);
-                       delete s;
-                       stillchildren = true;
-                       break;
-               }
+               std::vector<TreeServer*>::iterator a = Children.begin();
+               if (a == Children.end())
+                       return true;
+               TreeServer* s = *a;
+               s->Tidy();
+               s->cull();
+               Children.erase(a);
+               delete s;
        }
-       return true;
 }
 
 CullResult TreeServer::cull()