]> git.ipfire.org Git - thirdparty/dovecot/core.git/commitdiff
Added io_loop_set_max_fd_count() to specify how many fds we expect to use.
authorTimo Sirainen <tss@iki.fi>
Thu, 15 Jan 2009 21:20:09 +0000 (16:20 -0500)
committerTimo Sirainen <tss@iki.fi>
Thu, 15 Jan 2009 21:20:09 +0000 (16:20 -0500)
It's used currently only for figuring out how much space should be
allocated initially to fds.

--HG--
branch : HEAD

src/lib/ioloop-epoll.c
src/lib/ioloop-internal.h
src/lib/ioloop-kqueue.c
src/lib/ioloop-poll.c
src/lib/ioloop.c
src/lib/ioloop.h

index f657f57fad86d84b48adceab82875f982661f441..b82881679140e5c9405607288e8d7104b55be959 100644 (file)
@@ -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);
+       i_array_init(&ctx->events, initial_fd_count);
+       i_array_init(&ctx->fd_index, initial_fd_count);
 
-       ctx->epfd = epoll_create(IOLOOP_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);
index 7a61be8270a4e1f1a27105876bd944755c975102..c7b294b21a59615b4dd08eb9c583862c1be986b3 100644 (file)
@@ -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_timeouts(struct ioloop *ioloop);
 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);
index e34792f46653179830b543a9e7d88e242c6e942d..fc7c631a3b8aad836d3d49b58afe6350274fad85 100644 (file)
@@ -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 *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)
index f89ffbe91969ac10346711e80ea384830e07f16a..f1e2bf0dec27c32db0a1aa9cb0828d53a7fcc561 100644 (file)
@@ -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);
 }
index 3da02a0ab3bc9c484a69eec064dca7976f7ae3b6..e4b6be8d1505b255cd97ffd95f907a82832102e6 100644 (file)
@@ -19,6 +19,16 @@ 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,
                  io_callback_t *callback, void *context)
@@ -38,7 +48,7 @@ struct io *io_add(int fd, enum io_condition condition,
        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_handle_timeouts(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)
@@ -338,6 +348,11 @@ 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)
 {
         return ioloop->running;
index 9d1c5ed8524a3e64f854ba253a84f1d9ff7fb4b8..6b0a19a1683709f0ea0b51a5377e9e65a09c8356 100644 (file)
@@ -88,6 +88,8 @@ void io_loop_set_running(struct ioloop *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);