Fix unix version of windows bug found yesterday.

git-svn-id: file:///svn/unbound/trunk@1603 be551aaa-1e26-0410-a405-d3ace91eadb9
This commit is contained in:
Wouter Wijngaards 2009-04-17 07:59:32 +00:00
parent 9ea5b16bae
commit f3d98d17f4
3 changed files with 12 additions and 3 deletions

View 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.

View 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;

View 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 */