summary refs log tree commit diff
diff options
context:
space:
mode:
authorAlexander Barton <alex@barton.de>2020-05-03 02:55:34 +0200
committerAlexander Barton <alex@barton.de>2020-05-04 00:46:56 +0200
commit387a29a7fdbf00f5d792ba1450c608db8670308a (patch)
treeaec66f5361d7218d5012e22288a5a6a05045f74b
parent54fac576030d7aaf8bce4a982c880fe18680741e (diff)
downloadngircd-387a29a7fdbf00f5d792ba1450c608db8670308a.tar.gz
ngircd-387a29a7fdbf00f5d792ba1450c608db8670308a.zip
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!
-rw-r--r--src/ngircd/conn.c13
1 files changed, 9 insertions, 4 deletions
diff --git a/src/ngircd/conn.c b/src/ngircd/conn.c
index ca7030f4..c304fdb5 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);