]> git.netwichtig.de Git - user/henk/code/inspircd.git/blobdiff - src/inspircd.cpp
Removed unncessary sched_yield calls
[user/henk/code/inspircd.git] / src / inspircd.cpp
index 701b953819c2f1497d080a8c655fbe5dbae2a788..a9398c3824c2e4011559d76bb0847480de4e4629 100644 (file)
@@ -88,7 +88,8 @@ int WHOWAS_STALE = 48; // default WHOWAS Entries last 2 days before they go 'sta
 int WHOWAS_MAX = 100;  // default 100 people maximum in the WHOWAS list
 int DieDelay  =  5;
 time_t startup_time = time(NULL);
-int NetBufferSize = 10240; // NetBufferSize used as the buffer size for all read() ops
+int NetBufferSize = 10240;     // NetBufferSize used as the buffer size for all read() ops
+int MaxConn = SOMAXCONN;       // size of accept() backlog (128 by default on *BSD)
 extern int MaxWhoResults;
 time_t nb_start = 0;
 int dns_timeout = 5;
@@ -232,7 +233,7 @@ std::string getadminnick()
 
 void ReadConfig(bool bail, userrec* user)
 {
-       char dbg[MAXBUF],pauseval[MAXBUF],Value[MAXBUF],timeout[MAXBUF],NB[MAXBUF],flood[MAXBUF],MW[MAXBUF];
+       char dbg[MAXBUF],pauseval[MAXBUF],Value[MAXBUF],timeout[MAXBUF],NB[MAXBUF],flood[MAXBUF],MW[MAXBUF],MCON[MAXBUF];
        char AH[MAXBUF],AP[MAXBUF],AF[MAXBUF],DNT[MAXBUF],pfreq[MAXBUF],thold[MAXBUF],sqmax[MAXBUF],rqmax[MAXBUF];
        ConnectClass c;
        std::stringstream errstr;
@@ -293,12 +294,18 @@ void ReadConfig(bool bail, userrec* user)
        ConfValue("dns","timeout",0,DNT,&config_f);
        ConfValue("options","moduledir",0,ModPath,&config_f);
         ConfValue("disabled","commands",0,DisabledCommands,&config_f);
+       ConfValue("options","somaxconn",0,MCON,&config_f);
 
+       MaxConn = atoi(MCON);
+       if (MaxConn > SOMAXCONN)
+               log(DEFAULT,"WARNING: <options:somaxconn> value may be higher than the system-defined SOMAXCONN value!");
        NetBufferSize = atoi(NB);
        MaxWhoResults = atoi(MW);
        dns_timeout = atoi(DNT);
        if (!dns_timeout)
                dns_timeout = 5;
+       if (!MaxConn)
+               MaxConn = SOMAXCONN;
        if (!DNSServer[0])
                strlcpy(DNSServer,"127.0.0.1",MAXBUF);
        if (!ModPath[0])
@@ -2704,7 +2711,7 @@ int InspIRCd(char** argv, int argc)
        {
                struct kevent ke;
                log(DEBUG,"kqueue: Add listening socket to events, kq=%d socket=%d",lkq,openSockfd[count]);
-               EV_SET(&ke, openSockfd[count], EVFILT_READ, EV_ADD, 0, 32, NULL);
+               EV_SET(&ke, openSockfd[count], EVFILT_READ, EV_ADD, 0, MaxConn, NULL);
                int i = kevent(lkq, &ke, 1, 0, 0, NULL);
                if (i == -1)
                {
@@ -2719,7 +2726,7 @@ int InspIRCd(char** argv, int argc)
                 if (me[t])
                 {
                        log(DEBUG,"kqueue: Add listening SERVER socket to events, kq=%d socket=%d",skq,me[t]->fd);
-                       EV_SET(&ke, me[t]->fd, EVFILT_READ, EV_ADD, 0, 32, NULL);
+                       EV_SET(&ke, me[t]->fd, EVFILT_READ, EV_ADD, 0, MaxConn, NULL);
                        int i = kevent(skq, &ke, 1, 0, 0, NULL);
                        if (i == -1)
                        {
@@ -2796,9 +2803,6 @@ int InspIRCd(char** argv, int argc)
 
 #ifdef USE_EPOLL
                i = epoll_wait(sep, event, 1, EP_DELAY);
-#ifdef _POSIX_PRIORITY_SCHEDULING
-                                sched_yield();
-#endif
                if (i > 0)
                {
                        log(DEBUG,"epoll: Listening server socket event, i=%d, event.data.fd=%d",i,event[0].data.fd);
@@ -2855,49 +2859,45 @@ int InspIRCd(char** argv, int argc)
                        }
                }
      
+               std::deque<std::string> msgs;
+               std::deque<std::string> sums;
                for (int x = 0; x < SERVERportCount; x++)
                {
-                       std::deque<std::string> msgs;
-                       std::deque<std::string> sums;
-                       msgs.clear();
                        sums.clear();
-                       if (me[x])
+                       msgs.clear();
+                       while ((me[x]) && (me[x]->RecvPacket(msgs, tcp_host, sums))) // returns 0 or more lines (can be multiple lines!)
                        {
-                               sums.clear();
-                               msgs.clear();
-                               while (me[x]->RecvPacket(msgs, tcp_host, sums))
+                               for (int ctr = 0; ctr < msgs.size(); ctr++)
                                {
-                                       for (int ctr = 0; ctr < msgs.size(); ctr++)
+                                       strlcpy(tcp_msg,msgs[ctr].c_str(),MAXBUF);
+                                       strlcpy(tcp_sum,msgs[ctr].c_str(),MAXBUF);
+                                       log(DEBUG,"Processing: %s",tcp_msg);
+                                       if (!tcp_msg[0])
+                                       {
+                                               log(DEBUG,"Invalid string from %s [route%lu]",tcp_host,(unsigned long)x);
+                                               break;
+                                       }
+                                       // during a netburst, send all data to all other linked servers
+                                       if ((((nb_start>0) && (tcp_msg[0] != 'Y') && (tcp_msg[0] != 'X') && (tcp_msg[0] != 'F'))) || (is_uline(tcp_host)))
                                        {
-                                               strlcpy(tcp_msg,msgs[ctr].c_str(),MAXBUF);
-                                               strlcpy(tcp_sum,msgs[ctr].c_str(),MAXBUF);
-                                               log(DEBUG,"Processing: %s",tcp_msg);
-                                               if (!tcp_msg[0])
-                                               {
-                                                       log(DEBUG,"Invalid string from %s [route%lu]",tcp_host,(unsigned long)x);
-                                                       break;
-                                               }
-                                               // during a netburst, send all data to all other linked servers
-                                               if ((((nb_start>0) && (tcp_msg[0] != 'Y') && (tcp_msg[0] != 'X') && (tcp_msg[0] != 'F'))) || (is_uline(tcp_host)))
+                                               if (is_uline(tcp_host))
                                                {
-                                                       if (is_uline(tcp_host))
+                                                       if ((tcp_msg[0] != 'Y') && (tcp_msg[0] != 'X') && (tcp_msg[0] != 'F'))
                                                        {
-                                                               if ((tcp_msg[0] != 'Y') && (tcp_msg[0] != 'X') && (tcp_msg[0] != 'F'))
-                                                               {
-                                                                       NetSendToAllExcept_WithSum(tcp_host,tcp_msg,tcp_sum);
-                                                               }
-                                                       }
-                                                       else
                                                                NetSendToAllExcept_WithSum(tcp_host,tcp_msg,tcp_sum);
+                                                       }
                                                }
-                                               std::string msg = tcp_msg;
-                                               FOREACH_MOD OnPacketReceive(msg,tcp_host);
-                                               strlcpy(tcp_msg,msg.c_str(),MAXBUF);
-                                               if (me[x])
-                                                       handle_link_packet(tcp_msg, tcp_host, me[x], tcp_sum);
+                                               else
+                                                       NetSendToAllExcept_WithSum(tcp_host,tcp_msg,tcp_sum);
                                        }
-                                       //goto label;
+                                       std::string msg = tcp_msg;
+                                       FOREACH_MOD OnPacketReceive(msg,tcp_host);
+                                       strlcpy(tcp_msg,msg.c_str(),MAXBUF);
+                                       if (me[x])
+                                               handle_link_packet(tcp_msg, tcp_host, me[x], tcp_sum);
                                }
+                                       sums.clear();   // we're done, clear the list for the next operation
+                                       msgs.clear();
                        }
                }
        
@@ -3320,13 +3320,7 @@ int InspIRCd(char** argv, int argc)
                        {
 #endif
 #ifdef USE_EPOLL
-#ifdef _POSIX_PRIORITY_SCHEDULING
-                                sched_yield();
-#endif
        i = epoll_wait(lep, event, 32, EP_DELAY);
-#ifdef _POSIX_PRIORITY_SCHEDULING
-                                sched_yield();
-#endif
        if (i > 0) for (j = 0; j < i; j++)
        {
                log(DEBUG,"epoll: Listening socket event, i=%d,events[j].data.fd=%d",i,event[j].data.fd);