summary refs log tree commit diff stats
diff options
context:
space:
mode:
authorBen Gamari <ben@smart-cactus.org>2016-05-08 21:44:29 +0200
committerPatrick Griffis <tingping@tingping.se>2016-06-29 15:42:11 -0400
commit25e197a6c84463e967065c64b5760b79884787cc (patch)
tree033d41307e3aed117fd1f15a802763930fffcea4
parent7dca22048633479e28fec8e311ae80c9f55d46b6 (diff)
dcc: Disable timeout timer when not in use
This should mean that hexchat never *needs* to wake-up unless prompted
by socket activity (assuming that the lag-o-meter is not enabled).
-rw-r--r--src/common/dcc.c18
-rw-r--r--src/common/dcc.h1
-rw-r--r--src/common/hexchat.c8
3 files changed, 16 insertions, 11 deletions
diff --git a/src/common/dcc.c b/src/common/dcc.c
index cf909a14..d288556e 100644
--- a/src/common/dcc.c
+++ b/src/common/dcc.c
@@ -63,6 +63,9 @@
 #define lseek _lseeki64
 #endif
 
+/* interval timer to detect timeouts */
+static int timeout_timer = 0;
+
 static char *dcctypes[] = { "SEND", "RECV", "CHAT", "CHAT" };
 
 struct dccstat_info dccstat[] = {
@@ -82,6 +85,7 @@ static void dcc_close (struct DCC *dcc, int dccstat, int destroy);
 static gboolean dcc_send_data (GIOChannel *, GIOCondition, struct DCC *);
 static gboolean dcc_read (GIOChannel *, GIOCondition, struct DCC *);
 static gboolean dcc_read_ack (GIOChannel *source, GIOCondition condition, struct DCC *dcc);
+static int dcc_check_timeouts (void);
 
 static int new_id(void)
 {
@@ -233,9 +237,9 @@ is_dcc_completed (struct DCC *dcc)
 	return FALSE;
 }
 
-/* this is called from hexchat.c:hexchat_check_dcc() every 1 second. */
+/* this is called by timeout_timer every 1 second. */
 
-void
+int
 dcc_check_timeouts (void)
 {
 	struct DCC *dcc;
@@ -292,6 +296,7 @@ dcc_check_timeouts (void)
 		}
 		list = next;
 	}
+	return 1;
 }
 
 static int
@@ -419,6 +424,11 @@ dcc_close (struct DCC *dcc, int dccstat, int destroy)
 		g_free (dcc->destfile);
 		g_free (dcc->nick);
 		g_free (dcc);
+		if (dcc_list == NULL && timeout_timer != 0)
+		{
+			fe_timeout_remove (timeout_timer);
+			timeout_timer = 0;
+		}
 		return;
 	}
 
@@ -2222,6 +2232,10 @@ new_dcc (void)
 	dcc->sok = -1;
 	dcc->fp = -1;
 	dcc_list = g_slist_prepend (dcc_list, dcc);
+	if (timeout_timer == 0)
+	{
+		timeout_timer = fe_timeout_add (1000, dcc_check_timeouts, NULL);
+	}
 	return dcc;
 }
 
diff --git a/src/common/dcc.h b/src/common/dcc.h
index e7115b32..e5d0809f 100644
--- a/src/common/dcc.h
+++ b/src/common/dcc.h
@@ -110,7 +110,6 @@ gboolean is_dcc_completed (struct DCC *dcc);
 void dcc_abort (session *sess, struct DCC *dcc);
 void dcc_get (struct DCC *dcc);
 int dcc_resume (struct DCC *dcc);
-void dcc_check_timeouts (void);
 void dcc_change_nick (server *serv, char *oldnick, char *newnick);
 void dcc_notify_kill (struct server *serv);
 struct DCC *dcc_write_chat (char *nick, char *text);
diff --git a/src/common/hexchat.c b/src/common/hexchat.c
index 8da63aef..1f61f84f 100644
--- a/src/common/hexchat.c
+++ b/src/common/hexchat.c
@@ -354,13 +354,6 @@ doover:
 	return 1;
 }
 
-static int
-hexchat_check_dcc (void)	/* this gets called every 1 second */
-{
-	dcc_check_timeouts ();
-	return 1;
-}
-
 /* these are only run if the lagometer is enabled */
 static int
 hexchat_lag_check (void)   /* this gets called every 30 seconds */
@@ -406,7 +399,6 @@ irc_init (session *sess)
 					     notify_checklist, NULL);
 
 	fe_timeout_add (prefs.hex_away_timeout * 1000, away_check, NULL);
-	fe_timeout_add (1000, hexchat_check_dcc, NULL);
 	if (prefs.hex_gui_lagometer)
 	{
 		fe_timeout_add (500, hexchat_lag_check_update, NULL);