From dab91877bc0e4a1fc31df89a1d1d42e73c3996e1 Mon Sep 17 00:00:00 2001 From: Nick Mathewson Date: Tue, 24 Jan 2012 11:04:19 -0500 Subject: [PATCH] Workaround in the unit tests for an apparent epoll bug in Linux 3.2 --- test/regress_et.c | 18 +++++++++++------- 1 file changed, 11 insertions(+), 7 deletions(-) diff --git a/test/regress_et.c b/test/regress_et.c index 7b2d94a8..0b871cfe 100644 --- a/test/regress_et.c +++ b/test/regress_et.c @@ -54,21 +54,24 @@ static int was_et = 0; static void read_cb(evutil_socket_t fd, short event, void *arg) { - char buf; - int len; +// char buf; +// int len; - len = recv(fd, &buf, sizeof(buf), 0); - - /*printf("%s: %s %d%s\n", __func__, event & EV_ET ? "etread" : "read", - len, len ? "" : " - means EOF"); - */ + /* On Linux 3.2.1 (at least, as patched by Fedora and tested by Nick), + * doing this "recv" resets the readability of the socket, even though + * there is no state change. Yuck! Linux 3.1.9 didn't have this + * problem. + */ +// len = recv(fd, &buf, sizeof(buf), 0); called++; if (event & EV_ET) was_et = 1; +#if 0 if (!len) event_del(arg); +#endif } #ifndef SHUT_WR @@ -98,6 +101,7 @@ test_edgetriggered(void *et) send(pair[0], test, (int)strlen(test)+1, 0); shutdown(pair[0], SHUT_WR); + sleep(1); /* Initalize the event library */ base = event_base_new();