From: Timo Sirainen Date: Thu, 12 Nov 2015 10:14:20 +0000 (+0200) Subject: lib: Added io_loop_find_fd_conditions() X-Git-Tag: 2.2.20.rc1~98 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=7f52e276c1bf13b4809344492023b90e46c3ac5d;p=thirdparty%2Fdovecot%2Fcore.git lib: Added io_loop_find_fd_conditions() --- diff --git a/src/lib/ioloop.c b/src/lib/ioloop.c index 1ee2673002..efc80aa695 100644 --- a/src/lib/ioloop.c +++ b/src/lib/ioloop.c @@ -948,3 +948,17 @@ uint64_t io_loop_get_wait_usecs(struct ioloop *ioloop) { return ioloop->ioloop_wait_usecs; } + +enum io_condition io_loop_find_fd_conditions(struct ioloop *ioloop, int fd) +{ + enum io_condition conditions = 0; + struct io_file *io; + + i_assert(fd >= 0); + + for (io = ioloop->io_files; io != NULL; io = io->next) { + if (io->fd == fd) + conditions |= io->io.condition; + } + return conditions; +} diff --git a/src/lib/ioloop.h b/src/lib/ioloop.h index 1ae8d5c399..229f73dc17 100644 --- a/src/lib/ioloop.h +++ b/src/lib/ioloop.h @@ -187,5 +187,8 @@ bool io_loop_have_ios(struct ioloop *ioloop); bool io_loop_have_immediate_timeouts(struct ioloop *ioloop); /* Returns number of microseconds spent on the ioloop waiting itself. */ uint64_t io_loop_get_wait_usecs(struct ioloop *ioloop); +/* Return all io conditions added for the given fd. This needs to scan through + all the file ios in the ioloop. */ +enum io_condition io_loop_find_fd_conditions(struct ioloop *ioloop, int fd); #endif diff --git a/src/lib/test-ioloop.c b/src/lib/test-ioloop.c index 20c6207b6b..a028f51a97 100644 --- a/src/lib/test-ioloop.c +++ b/src/lib/test-ioloop.c @@ -1,6 +1,7 @@ /* Copyright (c) 2015 Dovecot authors, see the included COPYING file */ #include "test-lib.h" +#include "net.h" #include "time-util.h" #include "ioloop.h" @@ -50,7 +51,55 @@ static void test_ioloop_timeout(void) test_end(); } +static void io_callback(void *context ATTR_UNUSED) +{ +} + +static void test_ioloop_find_fd_conditions(void) +{ + struct { + enum io_condition condition; + int fd[2]; + struct io *io; + } tests[] = { + { IO_ERROR, { -1, -1 }, NULL }, + { IO_READ, { -1, -1 }, NULL }, + { IO_WRITE, { -1, -1 }, NULL }, + { IO_READ | IO_WRITE, { -1, -1 }, NULL }, + { IO_READ, { -1, -1 }, NULL } /* read+write as separate ios */ + }; + struct ioloop *ioloop; + struct io *io; + unsigned int i; + + test_begin("ioloop find fd conditions"); + + ioloop = io_loop_create(); + + for (i = 0; i < N_ELEMENTS(tests); i++) { + if (socketpair(AF_UNIX, SOCK_STREAM, 0, tests[i].fd) < 0) + i_fatal("socketpair() failed: %m"); + tests[i].io = io_add(tests[i].fd[0], tests[i].condition, io_callback, NULL); + } + io = io_add(tests[i-1].fd[0], IO_WRITE, io_callback, NULL); + tests[i-1].condition |= IO_WRITE; + + for (i = 0; i < N_ELEMENTS(tests); i++) + test_assert_idx(io_loop_find_fd_conditions(ioloop, tests[i].fd[0]) == tests[i].condition, i); + + io_remove(&io); + for (i = 0; i < N_ELEMENTS(tests); i++) { + io_remove(&tests[i].io); + i_close_fd(&tests[i].fd[0]); + i_close_fd(&tests[i].fd[1]); + } + io_loop_destroy(&ioloop); + + test_end(); +} + void test_ioloop(void) { test_ioloop_timeout(); + test_ioloop_find_fd_conditions(); }