diff options
Diffstat (limited to 'src/fdevent_select.c')
-rw-r--r-- | src/fdevent_select.c | 56 |
1 files changed, 29 insertions, 27 deletions
diff --git a/src/fdevent_select.c b/src/fdevent_select.c index 3eb10f3..2e23dce 100644 --- a/src/fdevent_select.c +++ b/src/fdevent_select.c @@ -1,3 +1,7 @@ +#include "fdevent.h" +#include "buffer.h" +#include "log.h" + #include <sys/time.h> #include <sys/types.h> @@ -9,10 +13,6 @@ #include <fcntl.h> #include <assert.h> -#include "fdevent.h" -#include "settings.h" -#include "buffer.h" - #ifdef USE_SELECT static int fdevent_select_reset(fdevents *ev) { @@ -34,43 +34,45 @@ static int fdevent_select_event_del(fdevents *ev, int fde_ndx, int fd) { return -1; } -static int fdevent_select_event_add(fdevents *ev, int fde_ndx, int fd, int events) { +static int fdevent_select_event_set(fdevents *ev, int fde_ndx, int fd, int events) { UNUSED(fde_ndx); /* we should be protected by max-fds, but you never know */ - assert(fd < FD_SETSIZE); + assert(fd < ((int)FD_SETSIZE)); if (events & FDEVENT_IN) { FD_SET(fd, &(ev->select_set_read)); - FD_CLR(fd, &(ev->select_set_write)); + } else { + FD_CLR(fd, &(ev->select_set_read)); } if (events & FDEVENT_OUT) { - FD_CLR(fd, &(ev->select_set_read)); FD_SET(fd, &(ev->select_set_write)); + } else { + FD_CLR(fd, &(ev->select_set_write)); } FD_SET(fd, &(ev->select_set_error)); - + if (fd > ev->select_max_fd) ev->select_max_fd = fd; - + return fd; } static int fdevent_select_poll(fdevents *ev, int timeout_ms) { struct timeval tv; - + tv.tv_sec = timeout_ms / 1000; tv.tv_usec = (timeout_ms % 1000) * 1000; - + ev->select_read = ev->select_set_read; ev->select_write = ev->select_set_write; ev->select_error = ev->select_set_error; - + return select(ev->select_max_fd + 1, &(ev->select_read), &(ev->select_write), &(ev->select_error), &tv); } static int fdevent_select_event_get_revent(fdevents *ev, size_t ndx) { int revents = 0; - + if (FD_ISSET(ndx, &(ev->select_read))) { revents |= FDEVENT_IN; } @@ -80,7 +82,7 @@ static int fdevent_select_event_get_revent(fdevents *ev, size_t ndx) { if (FD_ISSET(ndx, &(ev->select_error))) { revents |= FDEVENT_ERR; } - + return revents; } @@ -92,33 +94,33 @@ static int fdevent_select_event_get_fd(fdevents *ev, size_t ndx) { static int fdevent_select_event_next_fdndx(fdevents *ev, int ndx) { int i; - + i = (ndx < 0) ? 0 : ndx + 1; - + for (; i < ev->select_max_fd + 1; i++) { - if (FD_ISSET(i, &(ev->select_read))) break; - if (FD_ISSET(i, &(ev->select_write))) break; - if (FD_ISSET(i, &(ev->select_error))) break; + if (FD_ISSET(i, &(ev->select_read))) return i; + if (FD_ISSET(i, &(ev->select_write))) return i; + if (FD_ISSET(i, &(ev->select_error))) return i; } - - return i; + + return -1; } int fdevent_select_init(fdevents *ev) { ev->type = FDEVENT_HANDLER_SELECT; #define SET(x) \ ev->x = fdevent_select_##x; - + SET(reset); SET(poll); - + SET(event_del); - SET(event_add); - + SET(event_set); + SET(event_next_fdndx); SET(event_get_fd); SET(event_get_revent); - + return 0; } |