changeset 5324:e5cbedfa3dd9 draft

eloop: Don't remove existing callbacks when adding events While here, add some debug when dealing with many sockets.
author Roy Marples <roy@marples.name>
date Mon, 08 Jun 2020 21:41:42 +0100
parents 742ab5ed32b8
children 896eb853623a
files src/eloop.c
diffstat 1 files changed, 16 insertions(+), 6 deletions(-) [+]
line wrap: on
line diff
--- a/src/eloop.c	Sun Jun 07 23:39:46 2020 +0100
+++ b/src/eloop.c	Mon Jun 08 21:41:42 2020 +0100
@@ -88,6 +88,10 @@
 #endif
 #endif
 
+#ifdef ELOOP_DEBUG
+#include <stdio.h>
+#endif
+
 /*
  * time_t is a signed integer of an unspecified size.
  * To adjust for time_t wrapping, we need to work the maximum signed
@@ -277,6 +281,10 @@
 
 	pfd = eloop->fds;
 	TAILQ_FOREACH(e, &eloop->events, next) {
+#ifdef ELOOP_DEBUG
+		fprintf(stderr, "%s(%d) fd=%d, rcb=%p, wcb=%p\n",
+		    __func__, getpid(), e->fd, e->read_cb, e->write_cb);
+#endif
 		e->pollfd = pfd;
 		pfd->fd = e->fd;
 		pfd->events = 0;
@@ -332,10 +340,14 @@
 		eloop->nevents++;
 	}
 
-	e->read_cb = read_cb;
-	e->read_cb_arg = read_cb_arg;
-	e->write_cb = write_cb;
-	e->write_cb_arg = write_cb_arg;
+	if (read_cb) {
+		e->read_cb = read_cb;
+		e->read_cb_arg = read_cb_arg;
+	}
+	if (write_cb) {
+		e->write_cb = write_cb;
+		e->write_cb_arg = write_cb_arg;
+	}
 
 	eloop_event_setup_fds(eloop);
 	return 0;
@@ -374,8 +386,6 @@
 	}
 
 	if (write_only) {
-		if (e->write_cb == NULL)
-			return 0;
 		if (e->read_cb == NULL)
 			goto remove;
 		e->write_cb = NULL;