From: Timo Sirainen Date: Thu, 15 Jan 2009 21:20:09 +0000 (-0500) Subject: Added io_loop_set_max_fd_count() to specify how many fds we expect to use. X-Git-Tag: 1.2.beta1~109 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=dac0b2e5e0f38c6d95ef1a842d891480db580236;p=thirdparty%2Fdovecot%2Fcore.git 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. --HG-- branch : HEAD --- diff --git a/src/lib/ioloop-epoll.c b/src/lib/ioloop-epoll.c index f657f57fad..b828816791 100644 --- a/src/lib/ioloop-epoll.c +++ b/src/lib/ioloop-epoll.c @@ -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); diff --git a/src/lib/ioloop-internal.h b/src/lib/ioloop-internal.h index 7a61be8270..c7b294b21a 100644 --- a/src/lib/ioloop-internal.h +++ b/src/lib/ioloop-internal.h @@ -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); diff --git a/src/lib/ioloop-kqueue.c b/src/lib/ioloop-kqueue.c index e34792f466..fc7c631a3b 100644 --- a/src/lib/ioloop-kqueue.c +++ b/src/lib/ioloop-kqueue.c @@ -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) diff --git a/src/lib/ioloop-poll.c b/src/lib/ioloop-poll.c index f89ffbe919..f1e2bf0dec 100644 --- a/src/lib/ioloop-poll.c +++ b/src/lib/ioloop-poll.c @@ -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 --git a/src/lib/ioloop.c b/src/lib/ioloop.c index 3da02a0ab3..e4b6be8d15 100644 --- a/src/lib/ioloop.c +++ b/src/lib/ioloop.c @@ -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; diff --git a/src/lib/ioloop.h b/src/lib/ioloop.h index 9d1c5ed852..6b0a19a168 100644 --- a/src/lib/ioloop.h +++ b/src/lib/ioloop.h @@ -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);