]> git.netwichtig.de Git - user/henk/code/inspircd.git/commitdiff
Services speedups for stupid buffered i/o uplinks
authorbrain <brain@e03df62e-2008-0410-955e-edbf42e46eb7>
Sat, 23 Apr 2005 22:24:27 +0000 (22:24 +0000)
committerbrain <brain@e03df62e-2008-0410-955e-edbf42e46eb7>
Sat, 23 Apr 2005 22:24:27 +0000 (22:24 +0000)
git-svn-id: http://svn.inspircd.org/repository/trunk/inspircd@1175 e03df62e-2008-0410-955e-edbf42e46eb7

include/connection.h
src/connection.cpp

index 65b6deed3b0bb3c9dc927c90e44b8c69b43e3c70..444d82d23aeb59298a3eb206f163733e219b0af3 100644 (file)
@@ -163,7 +163,7 @@ class ircd_connector : public Extensible
         */
        void CloseConnection();
 
-       void AddBuffer(char a);
+       void AddBuffer(std::string a);
        bool BufferIsComplete();
        void ClearBuffer();
        std::string GetBuffer();
index e6a2dc1d0efe28e03bd8d980073214ff4ea7e497..b7f99fb75c1a5ff665d05b7e7ab64b1d79bc2572 100644 (file)
@@ -17,6 +17,7 @@
 #include <connection.h>
 #include <unistd.h>
 #include <fcntl.h>
+#include <poll.h>
 #include <sys/errno.h>
 #include <sys/ioctl.h>
 #include <sys/utsname.h>
@@ -136,36 +137,41 @@ void ircd_connector::SetServerPort(int p)
        this->port = p;
 }
 
-void ircd_connector::AddBuffer(char a)
+void ircd_connector::AddBuffer(std::string a)
 {
-       if (a != '\r')
-               ircdbuffer = ircdbuffer + a;
+       for (int i = 0; i < a.length(); i++)
+               if (a[i] != '\r')
+                       ircdbuffer = ircdbuffer + a[i];
 }
 
 bool ircd_connector::BufferIsComplete()
 {
-       if (ircdbuffer.length())
-       {
-               return (ircdbuffer[ircdbuffer.length()-1] == '\n');
-       }
+       for (int i = 0; i < ircdbuffer.length(); i++)
+               if (ircdbuffer[i] == '\n')
+                       return true;
        return false;
 }
 
 void ircd_connector::ClearBuffer()
 {
-       ircdbuffer = "";
+       while ((ircdbuffer != "") && (ircdbuffer[0] != '\n'))
+       {
+               ircdbuffer.erase(ircdbuffer.begin());
+       }
+       if (ircdbuffer != "")
+               ircdbuffer.erase(ircdbuffer.begin());
 }
 
 std::string ircd_connector::GetBuffer()
 {
-       if (ircdbuffer.length() < 510)
-       {
-               return ircdbuffer;
-       }
-       else
+       std::string z = "";
+       long t = 0;
+       while (ircdbuffer[t] != '\n')
        {
-               return ircdbuffer.substr(510);
+               z = z + ircdbuffer[t];
+               t++;
        }
+       return z;
 }
 
 bool ircd_connector::MakeOutboundConnection(char* host, int port)
@@ -456,7 +462,8 @@ bool connection::RecvPacket(std::deque<std::string> &messages, char* host)
                {
                        // returns false if the packet could not be sent (e.g. target host down)
                        int rcvsize = 0;
-                       rcvsize = recv(this->connectors[i].GetDescriptor(),data,1,0);
+                       rcvsize = recv(this->connectors[i].GetDescriptor(),data,32,0);
+                       data[rcvsize] == '\0';
                        if (rcvsize == -1)
                        {
                                if (errno != EAGAIN)
@@ -469,7 +476,7 @@ bool connection::RecvPacket(std::deque<std::string> &messages, char* host)
                        }
                        if (rcvsize > 0)
                        {
-                               this->connectors[i].AddBuffer(data[0]);
+                               this->connectors[i].AddBuffer(data);
                                if (this->connectors[i].BufferIsComplete())
                                {
                                        messages.push_back(this->connectors[i].GetBuffer().c_str());