dovecot-1.2: Added io_loop_set_max_fd_count() to specify how man...

dovecot at dovecot.org dovecot at dovecot.org
Thu Jan 15 23:22:30 EET 2009


details:   http://hg.dovecot.org/dovecot-1.2/rev/86c28d14ddeb
changeset: 8634:86c28d14ddeb
user:      Timo Sirainen <tss at iki.fi>
date:      Thu Jan 15 16:20:09 2009 -0500
description:
Added io_loop_set_max_fd_count() to specify how many fds we expect to use.
It's used currently only for figuring out how much space should be
allocated initially to fds.

diffstat:

6 files changed, 31 insertions(+), 13 deletions(-)
src/lib/ioloop-epoll.c    |   10 +++++-----
src/lib/ioloop-internal.h |    3 ++-
src/lib/ioloop-kqueue.c   |    4 ++--
src/lib/ioloop-poll.c     |    6 +++---
src/lib/ioloop.c          |   19 +++++++++++++++++--
src/lib/ioloop.h          |    2 ++

diffs (150 lines):

diff -r 7e4c1d8b2a1a -r 86c28d14ddeb src/lib/ioloop-epoll.c
--- a/src/lib/ioloop-epoll.c	Thu Jan 15 15:54:39 2009 -0500
+++ b/src/lib/ioloop-epoll.c	Thu Jan 15 16:20:09 2009 -0500
@@ -25,16 +25,16 @@ struct ioloop_handler_context {
 	ARRAY_DEFINE(events, struct epoll_event);
 };
 
-void io_loop_handler_init(struct ioloop *ioloop)
+void io_loop_handler_init(struct ioloop *ioloop, unsigned int initial_fd_count)
 {
 	struct ioloop_handler_context *ctx;
 
 	ioloop->handler_context = ctx = i_new(struct ioloop_handler_context, 1);
 
-	i_array_init(&ctx->events, IOLOOP_INITIAL_FD_COUNT);
-	i_array_init(&ctx->fd_index, IOLOOP_INITIAL_FD_COUNT);
-
-	ctx->epfd = epoll_create(IOLOOP_INITIAL_FD_COUNT);
+	i_array_init(&ctx->events, initial_fd_count);
+	i_array_init(&ctx->fd_index, initial_fd_count);
+
+	ctx->epfd = epoll_create(initial_fd_count);
 	if (ctx->epfd < 0)
 		i_fatal("epoll_create(): %m");
 	fd_close_on_exec(ctx->epfd, TRUE);
diff -r 7e4c1d8b2a1a -r 86c28d14ddeb src/lib/ioloop-internal.h
--- a/src/lib/ioloop-internal.h	Thu Jan 15 15:54:39 2009 -0500
+++ b/src/lib/ioloop-internal.h	Thu Jan 15 16:20:09 2009 -0500
@@ -17,6 +17,7 @@ struct ioloop {
 
         struct ioloop_handler_context *handler_context;
         struct ioloop_notify_handler_context *notify_handler_context;
+	unsigned int max_fd_count;
 
 	unsigned int running:1;
 };
@@ -60,7 +61,7 @@ void io_loop_handle_add(struct io_file *
 void io_loop_handle_add(struct io_file *io);
 void io_loop_handle_remove(struct io_file *io, bool closed);
 
-void io_loop_handler_init(struct ioloop *ioloop);
+void io_loop_handler_init(struct ioloop *ioloop, unsigned int initial_fd_count);
 void io_loop_handler_deinit(struct ioloop *ioloop);
 
 void io_loop_notify_remove(struct io *io);
diff -r 7e4c1d8b2a1a -r 86c28d14ddeb src/lib/ioloop-kqueue.c
--- a/src/lib/ioloop-kqueue.c	Thu Jan 15 15:54:39 2009 -0500
+++ b/src/lib/ioloop-kqueue.c	Thu Jan 15 16:20:09 2009 -0500
@@ -35,7 +35,7 @@ struct ioloop_handler_context {
 	ARRAY_DEFINE(events, struct kevent);
 };
 
-void io_loop_handler_init(struct ioloop *ioloop)
+void io_loop_handler_init(struct ioloop *ioloop, unsigned int initial_fd_count)
 {
 	struct ioloop_handler_context *ctx;
 
@@ -45,7 +45,7 @@ void io_loop_handler_init(struct ioloop 
 		i_fatal("kqueue() in io_loop_handler_init() failed: %m");
 	fd_close_on_exec(ctx->kq, TRUE);
 
-	i_array_init(&ctx->events, IOLOOP_INITIAL_FD_COUNT);
+	i_array_init(&ctx->events, initial_fd_count);
 }
 
 void io_loop_handler_deinit(struct ioloop *ioloop)
diff -r 7e4c1d8b2a1a -r 86c28d14ddeb src/lib/ioloop-poll.c
--- a/src/lib/ioloop-poll.c	Thu Jan 15 15:54:39 2009 -0500
+++ b/src/lib/ioloop-poll.c	Thu Jan 15 16:20:09 2009 -0500
@@ -18,15 +18,15 @@ struct ioloop_handler_context {
 	int *fd_index;
 };
 
-void io_loop_handler_init(struct ioloop *ioloop)
+void io_loop_handler_init(struct ioloop *ioloop, unsigned int initial_fd_count)
 {
 	struct ioloop_handler_context *ctx;
 
 	ioloop->handler_context = ctx = i_new(struct ioloop_handler_context, 1);
-	ctx->fds_count = IOLOOP_INITIAL_FD_COUNT;
+	ctx->fds_count = initial_fd_count;
 	ctx->fds = i_new(struct pollfd, ctx->fds_count);
 
-	ctx->idx_count = IOLOOP_INITIAL_FD_COUNT;
+	ctx->idx_count = initial_fd_count;
 	ctx->fd_index = i_new(int, ctx->idx_count);
         memset(ctx->fd_index, 0xff, sizeof(int) * ctx->idx_count);
 }
diff -r 7e4c1d8b2a1a -r 86c28d14ddeb src/lib/ioloop.c
--- a/src/lib/ioloop.c	Thu Jan 15 15:54:39 2009 -0500
+++ b/src/lib/ioloop.c	Thu Jan 15 16:20:09 2009 -0500
@@ -18,6 +18,16 @@ struct timezone ioloop_timezone;
 struct timezone ioloop_timezone;
 
 struct ioloop *current_ioloop = NULL;
+
+static void io_loop_initialize_handler(struct ioloop *ioloop)
+{
+	unsigned int initial_fd_count;
+
+	initial_fd_count = ioloop->max_fd_count > 0 &&
+		ioloop->max_fd_count < IOLOOP_INITIAL_FD_COUNT ?
+		ioloop->max_fd_count : IOLOOP_INITIAL_FD_COUNT;
+	io_loop_handler_init(ioloop, initial_fd_count);
+}
 
 #undef io_add
 struct io *io_add(int fd, enum io_condition condition,
@@ -38,7 +48,7 @@ struct io *io_add(int fd, enum io_condit
 	io->fd = fd;
 
 	if (io->io.ioloop->handler_context == NULL)
-		io_loop_handler_init(io->io.ioloop);
+		io_loop_initialize_handler(io->io.ioloop);
 	io_loop_handle_add(io);
 
 	if (io->io.ioloop->io_files != NULL) {
@@ -321,7 +331,7 @@ void io_loop_run(struct ioloop *ioloop)
 void io_loop_run(struct ioloop *ioloop)
 {
 	if (ioloop->handler_context == NULL)
-		io_loop_handler_init(ioloop);
+		io_loop_initialize_handler(ioloop);
 
 	ioloop->running = TRUE;
 	while (ioloop->running)
@@ -336,6 +346,11 @@ void io_loop_set_running(struct ioloop *
 void io_loop_set_running(struct ioloop *ioloop)
 {
         ioloop->running = TRUE;
+}
+
+void io_loop_set_max_fd_count(struct ioloop *ioloop, unsigned int max_fds)
+{
+	ioloop->max_fd_count = max_fds;
 }
 
 bool io_loop_is_running(struct ioloop *ioloop)
diff -r 7e4c1d8b2a1a -r 86c28d14ddeb src/lib/ioloop.h
--- a/src/lib/ioloop.h	Thu Jan 15 15:54:39 2009 -0500
+++ b/src/lib/ioloop.h	Thu Jan 15 16:20:09 2009 -0500
@@ -88,6 +88,8 @@ void io_loop_handler_run(struct ioloop *
 void io_loop_handler_run(struct ioloop *ioloop);
 
 struct ioloop *io_loop_create(void);
+/* Specify the maximum number of fds we're expecting to use. */
+void io_loop_set_max_fd_count(struct ioloop *ioloop, unsigned int max_fds);
 /* Destroy I/O loop and set ioloop pointer to NULL. */
 void io_loop_destroy(struct ioloop **ioloop);
 


More information about the dovecot-cvs mailing list