]> git.ipfire.org Git - thirdparty/unbound.git/commitdiff
Fix unix version of windows bug found yesterday.
authorWouter Wijngaards <wouter@nlnetlabs.nl>
Fri, 17 Apr 2009 07:59:32 +0000 (07:59 +0000)
committerWouter Wijngaards <wouter@nlnetlabs.nl>
Fri, 17 Apr 2009 07:59:32 +0000 (07:59 +0000)
git-svn-id: file:///svn/unbound/trunk@1603 be551aaa-1e26-0410-a405-d3ace91eadb9

doc/Changelog
util/mini_event.c
util/mini_event.h

index f469428e3d4228a97cd2da64c2fcf89ec1112326..7333cd37584b69fcf7c05012b97db2f9c2331576 100644 (file)
@@ -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.
index 2f84dd4b3fe39ee6841a3b8e6b14068da610c473..597276c8993db7d604e1a7fdb697591e1df3159d 100644 (file)
@@ -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; i<base->maxfd+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;
index 61cbcfbdb7222b18392c165b9dbc68c95237abef..4813402f079e36558e48fa0f18f1591a69962db0 100644 (file)
@@ -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 */