repo: ngircd
action: commit
revision: 
path_from: 
revision_from: 387a29a7fdbf00f5d792ba1450c608db8670308a:
path_to: 
revision_to: 
git.thebackupbox.net
ngircd
git clone git://git.thebackupbox.net/ngircd
commit 387a29a7fdbf00f5d792ba1450c608db8670308a
Author: Alexander Barton 
Date:   Sun May 3 02:55:34 2020 +0200

    Don't wait for the network when read buffers possibly hold commands

    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!

diff --git a/src/ngircd/conn.c b/src/ngircd/conn.c
index ca7030f4ebae1e487910310da2278e96f8287252..
index ..c304fdb574ffc497552f76fec4c531bb5c359abe 100644
--- a/src/ngircd/conn.c
+++ b/src/ngircd/conn.c
@@ -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);

-----END OF PAGE-----