mirror of
https://github.com/NLnetLabs/unbound.git
synced 2025-12-20 23:00:56 -05:00
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:
parent
9ea5b16bae
commit
f3d98d17f4
3 changed files with 12 additions and 3 deletions
|
|
@ -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
|
16 April 2009: Wouter
|
||||||
- winsock event handler exit very quickly on signal, even if
|
- winsock event handler exit very quickly on signal, even if
|
||||||
under heavy load.
|
under heavy load.
|
||||||
|
|
|
||||||
|
|
@ -182,6 +182,7 @@ static int handle_select(struct event_base* base, struct timeval* wait)
|
||||||
#endif
|
#endif
|
||||||
memmove(&r, &base->reads, sizeof(fd_set));
|
memmove(&r, &base->reads, sizeof(fd_set));
|
||||||
memmove(&w, &base->writes, 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) {
|
if((ret = select(base->maxfd+1, &r, &w, NULL, wait)) == -1) {
|
||||||
ret = errno;
|
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++) {
|
for(i=0; i<base->maxfd+1; i++) {
|
||||||
short bits = 0;
|
short bits = 0;
|
||||||
if(!base->fds[i]) {
|
if(!base->fds[i] || !(FD_ISSET(i, &base->ready))) {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
if(FD_ISSET(i, &r)) {
|
if(FD_ISSET(i, &r)) {
|
||||||
|
|
@ -301,6 +302,8 @@ int event_add(struct event* ev, struct timeval* tv)
|
||||||
if(ev->ev_events&EV_WRITE) {
|
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->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)
|
if(ev->ev_fd > ev->ev_base->maxfd)
|
||||||
ev->ev_base->maxfd = ev->ev_fd;
|
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;
|
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->reads);
|
||||||
FD_CLR(FD_SET_T ev->ev_fd, &ev->ev_base->writes);
|
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;
|
ev->added = 0;
|
||||||
return 0;
|
return 0;
|
||||||
|
|
|
||||||
|
|
@ -88,8 +88,8 @@ struct event_base
|
||||||
int maxfd;
|
int maxfd;
|
||||||
/** capacity - size of the fds array */
|
/** capacity - size of the fds array */
|
||||||
int capfd;
|
int capfd;
|
||||||
/** fdset for read write */
|
/** fdset for read write, for fds ready, and added */
|
||||||
fd_set reads, writes;
|
fd_set reads, writes, ready, content;
|
||||||
/** array of 0 - maxsig of ptr to event for it */
|
/** array of 0 - maxsig of ptr to event for it */
|
||||||
struct event** signals;
|
struct event** signals;
|
||||||
/** if we need to exit */
|
/** if we need to exit */
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue