Make sure select() callbacks are not called multiple times
the unix select function returns a set of file descriptors to be handled. the result-loop (the loop after the select()) is called again, if more than one descriptor is removed by the callback funtion. this may lead to a another call to the callback function, because the bits of the FD_SETs do not change and still set. i think we must clear these bits, if they are handled, so the handler will not be called twice in case of a "restart" of that loop.
This commit is contained in:
parent
604d851b89
commit
1e1c6aa5a3
|
@ -95,14 +95,20 @@ restart:
|
|||
llist_for_each_entry_safe(ufd, tmp, &bsc_fds, list) {
|
||||
int flags = 0;
|
||||
|
||||
if (FD_ISSET(ufd->fd, &readset))
|
||||
if (FD_ISSET(ufd->fd, &readset)) {
|
||||
flags |= BSC_FD_READ;
|
||||
FD_CLR(ufd->fd, &readset);
|
||||
}
|
||||
|
||||
if (FD_ISSET(ufd->fd, &writeset))
|
||||
if (FD_ISSET(ufd->fd, &writeset)) {
|
||||
flags |= BSC_FD_WRITE;
|
||||
FD_CLR(ufd->fd, &writeset);
|
||||
}
|
||||
|
||||
if (FD_ISSET(ufd->fd, &exceptset))
|
||||
if (FD_ISSET(ufd->fd, &exceptset)) {
|
||||
flags |= BSC_FD_EXCEPT;
|
||||
FD_CLR(ufd->fd, &exceptset);
|
||||
}
|
||||
|
||||
if (flags) {
|
||||
work = 1;
|
||||
|
|
Loading…
Reference in New Issue