Don't wait for the network when read buffers possibly hold commands
authorAlexander Barton <alex@barton.de>
Sun, 3 May 2020 00:55:34 +0000 (02:55 +0200)
committerAlexander Barton <alex@barton.de>
Sun, 3 May 2020 22:46:56 +0000 (00:46 +0200)
There is no point in waiting up to one second for the network receiving
new data when there is still a read buffer holding at least one command;
we shouldn't waste time but handle it immediately!

src/ngircd/conn.c

index ca7030f4ebae1e487910310da2278e96f8287252..c304fdb574ffc497552f76fec4c531bb5c359abe 100644 (file)
@@ -660,12 +660,14 @@ Conn_Handler(void)
        size_t wdatalen;
        struct timeval tv;
        time_t t;
+       bool command_available;
 
        Log(LOG_NOTICE, "Server \"%s\" (on \"%s\") ready.",
            Client_ID(Client_ThisServer()), Client_Hostname(Client_ThisServer()));
 
        while (!NGIRCd_SignalQuit && !NGIRCd_SignalRestart) {
                t = time(NULL);
+               command_available = false;
 
                /* Check configured servers and established links */
                Check_Servers();
@@ -743,19 +745,22 @@ Conn_Handler(void)
                                 * this command(s) to be handled first! */
                                io_event_del(My_Connections[i].sock,
                                             IO_WANTREAD);
+                               command_available = true;
                                continue;
                        }
 
                        io_event_add(My_Connections[i].sock, IO_WANTREAD);
                }
 
-               /* Set the timeout for reading from the network to 1 second,
-                * which is the granularity with witch we handle "penalty
-                * times" for example.
+               /* Don't wait for data when there is still at least one command
+                * available in a read buffer which can be handled immediately;
+                * set the timeout for reading from the network to 1 second
+                * otherwise, which is the granularity with witch we handle
+                * "penalty times" for example.
                 * Note: tv_sec/usec are undefined(!) after io_dispatch()
                 * returns, so we have to set it before each call to it! */
                tv.tv_usec = 0;
-               tv.tv_sec = 1;
+               tv.tv_sec = command_available ? 0 : 1;
 
                /* Wait for activity ... */
                i = io_dispatch(&tv);