From f3d98d17f480a75ef5de11eed35c166b986f0de7 Mon Sep 17 00:00:00 2001 From: Wouter Wijngaards Date: Fri, 17 Apr 2009 07:59:32 +0000 Subject: [PATCH] Fix unix version of windows bug found yesterday. git-svn-id: file:///svn/unbound/trunk@1603 be551aaa-1e26-0410-a405-d3ace91eadb9 --- doc/Changelog | 4 ++++ util/mini_event.c | 7 ++++++- util/mini_event.h | 4 ++-- 3 files changed, 12 insertions(+), 3 deletions(-) diff --git a/doc/Changelog b/doc/Changelog index f469428e3..7333cd375 100644 --- a/doc/Changelog +++ b/doc/Changelog @@ -1,3 +1,7 @@ +17 April 2009: Wouter + - Fix reentrant in minievent handler for unix. Could have resulted + in spurious event callbacks. + 16 April 2009: Wouter - winsock event handler exit very quickly on signal, even if under heavy load. diff --git a/util/mini_event.c b/util/mini_event.c index 2f84dd4b3..597276c89 100644 --- a/util/mini_event.c +++ b/util/mini_event.c @@ -182,6 +182,7 @@ static int handle_select(struct event_base* base, struct timeval* wait) #endif memmove(&r, &base->reads, sizeof(fd_set)); memmove(&w, &base->writes, sizeof(fd_set)); + memmove(&base->ready, &base->content, sizeof(fd_set)); if((ret = select(base->maxfd+1, &r, &w, NULL, wait)) == -1) { ret = errno; @@ -197,7 +198,7 @@ static int handle_select(struct event_base* base, struct timeval* wait) for(i=0; imaxfd+1; i++) { short bits = 0; - if(!base->fds[i]) { + if(!base->fds[i] || !(FD_ISSET(i, &base->ready))) { continue; } if(FD_ISSET(i, &r)) { @@ -301,6 +302,8 @@ int event_add(struct event* ev, struct timeval* tv) if(ev->ev_events&EV_WRITE) { FD_SET(FD_SET_T ev->ev_fd, &ev->ev_base->writes); } + FD_SET(FD_SET_T ev->ev_fd, &ev->ev_base->content); + FD_CLR(FD_SET_T ev->ev_fd, &ev->ev_base->ready); if(ev->ev_fd > ev->ev_base->maxfd) ev->ev_base->maxfd = ev->ev_fd; } @@ -331,6 +334,8 @@ int event_del(struct event* ev) ev->ev_base->fds[ev->ev_fd] = NULL; FD_CLR(FD_SET_T ev->ev_fd, &ev->ev_base->reads); FD_CLR(FD_SET_T ev->ev_fd, &ev->ev_base->writes); + FD_CLR(FD_SET_T ev->ev_fd, &ev->ev_base->ready); + FD_CLR(FD_SET_T ev->ev_fd, &ev->ev_base->content); } ev->added = 0; return 0; diff --git a/util/mini_event.h b/util/mini_event.h index 61cbcfbdb..4813402f0 100644 --- a/util/mini_event.h +++ b/util/mini_event.h @@ -88,8 +88,8 @@ struct event_base int maxfd; /** capacity - size of the fds array */ int capfd; - /** fdset for read write */ - fd_set reads, writes; + /** fdset for read write, for fds ready, and added */ + fd_set reads, writes, ready, content; /** array of 0 - maxsig of ptr to event for it */ struct event** signals; /** if we need to exit */ -- 2.47.3