dovecot-2.2: lib: Added io_loop_find_fd_conditions()
dovecot at dovecot.org
dovecot at dovecot.org
Thu Nov 12 10:18:35 UTC 2015
details: http://hg.dovecot.org/dovecot-2.2/rev/2f3b58470752
changeset: 19354:2f3b58470752
user: Timo Sirainen <tss at iki.fi>
date: Thu Nov 12 12:14:20 2015 +0200
description:
lib: Added io_loop_find_fd_conditions()
diffstat:
src/lib/ioloop.c | 14 ++++++++++++++
src/lib/ioloop.h | 3 +++
src/lib/test-ioloop.c | 49 +++++++++++++++++++++++++++++++++++++++++++++++++
3 files changed, 66 insertions(+), 0 deletions(-)
diffs (100 lines):
diff -r 53f4464235b3 -r 2f3b58470752 src/lib/ioloop.c
--- a/src/lib/ioloop.c Thu Nov 12 11:29:29 2015 +0200
+++ b/src/lib/ioloop.c Thu Nov 12 12:14:20 2015 +0200
@@ -948,3 +948,17 @@
{
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 -r 53f4464235b3 -r 2f3b58470752 src/lib/ioloop.h
--- a/src/lib/ioloop.h Thu Nov 12 11:29:29 2015 +0200
+++ b/src/lib/ioloop.h Thu Nov 12 12:14:20 2015 +0200
@@ -187,5 +187,8 @@
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 -r 53f4464235b3 -r 2f3b58470752 src/lib/test-ioloop.c
--- a/src/lib/test-ioloop.c Thu Nov 12 11:29:29 2015 +0200
+++ b/src/lib/test-ioloop.c Thu Nov 12 12:14:20 2015 +0200
@@ -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 @@
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();
}
More information about the dovecot-cvs
mailing list