]> git.ipfire.org Git - thirdparty/dovecot/core.git/commitdiff
lib: Added io_loop_find_fd_conditions()
authorTimo Sirainen <tss@iki.fi>
Thu, 12 Nov 2015 10:14:20 +0000 (12:14 +0200)
committerTimo Sirainen <tss@iki.fi>
Thu, 12 Nov 2015 10:14:20 +0000 (12:14 +0200)
src/lib/ioloop.c
src/lib/ioloop.h
src/lib/test-ioloop.c

index 1ee2673002e95572b276993eeda37d33ad09c9a1..efc80aa695924c7bc64ddba242ff94d9d9a98d29 100644 (file)
@@ -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;
+}
index 1ae8d5c399570ccb86447d916b65aea31db62230..229f73dc17276e5c3205a1cbbeb1010d8b608af2 100644 (file)
@@ -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
index 20c6207b6b2b4804d383d3d7c45d8a1c24367ecf..a028f51a97039fc17f9ce9cb5eb0326764c7fd8b 100644 (file)
@@ -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();
 }