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