[Dovecot] [PATCH] pass struct io * to io_loop_handle_add()/io_loop_handle_remove()

Andrey Panin pazke at donpac.ru
Mon Aug 23 15:50:34 EEST 2004


Hello,

currently I'm working on new ioloop handler which uses epoll(4) API
introduced in Linux kernel 2.6. In this API each fd added to fd set
by epoll_ctl system call can be accompanied with user supplied data
(integer or void pointer). epoll_wait syscall reports arrived events
as an array of structures containing event mask and user data.

Attached patch replaces fd and condition parameters passed to
io_loop_handle_add() with struct io pointer. Now io_loop_handle_add()
can pass this pointer as user data to epoll_ctl syscall and when
event arrives we will have corresponding io structure pointer
for free withiot traversing possibly long ioloop->ios list.

Please take a look.

Best regards.

-- 
Andrey Panin		| Linux and UNIX system administrator
pazke at donpac.ru		| PGP key: wwwkeys.pgp.net
-------------- next part --------------
diff -urpNX /usr/share/dontdiff dovecot-1.0-test32.vanilla/src/lib/ioloop.c dovecot-1.0-test32/src/lib/ioloop.c
--- dovecot-1.0-test32.vanilla/src/lib/ioloop.c	2004-06-24 12:14:14.000000000 +0400
+++ dovecot-1.0-test32/src/lib/ioloop.c	2004-08-21 18:04:35.000000000 +0400
@@ -56,7 +56,7 @@ struct io *io_add(int fd, enum io_condit
 	if (io->fd > current_ioloop->highest_fd)
 		current_ioloop->highest_fd = io->fd;
 
-	io_loop_handle_add(current_ioloop, io->fd, io->condition);
+	io_loop_handle_add(current_ioloop, io);
 
 	/* have to append it, or io_destroy() breaks */
         io_p = &current_ioloop->ios;
@@ -79,7 +79,7 @@ void io_remove(struct io *io)
 	i_assert(io->fd <= current_ioloop->highest_fd);
 
 	/* notify the real I/O handler */
-	io_loop_handle_remove(current_ioloop, io->fd, io->condition);
+	io_loop_handle_remove(current_ioloop, io);
 
 	io->destroyed = TRUE;
 
diff -urpNX /usr/share/dontdiff dovecot-1.0-test32.vanilla/src/lib/ioloop-internal.h dovecot-1.0-test32/src/lib/ioloop-internal.h
--- dovecot-1.0-test32.vanilla/src/lib/ioloop-internal.h	2003-09-07 05:52:06.000000000 +0400
+++ dovecot-1.0-test32/src/lib/ioloop-internal.h	2004-08-21 18:01:13.000000000 +0400
@@ -53,10 +53,8 @@ void io_destroy(struct ioloop *ioloop, s
 void timeout_destroy(struct ioloop *ioloop, struct timeout **timeout_p);
 
 /* I/O handler calls */
-void io_loop_handle_add(struct ioloop *ioloop, int fd,
-			enum io_condition condition);
-void io_loop_handle_remove(struct ioloop *ioloop, int fd,
-			   enum io_condition condition);
+void io_loop_handle_add(struct ioloop *ioloop, struct io *io);
+void io_loop_handle_remove(struct ioloop *ioloop, struct io *io);
 
 void io_loop_handler_init(struct ioloop *ioloop);
 void io_loop_handler_deinit(struct ioloop *ioloop);
diff -urpNX /usr/share/dontdiff dovecot-1.0-test32.vanilla/src/lib/ioloop-poll.c dovecot-1.0-test32/src/lib/ioloop-poll.c
--- dovecot-1.0-test32.vanilla/src/lib/ioloop-poll.c	2003-08-27 01:18:16.000000000 +0400
+++ dovecot-1.0-test32/src/lib/ioloop-poll.c	2004-08-21 18:46:22.000000000 +0400
@@ -45,12 +45,12 @@ void io_loop_handler_deinit(struct ioloo
 #define IO_POLL_INPUT (POLLIN|POLLPRI|POLLERR|POLLHUP|POLLNVAL)
 #define IO_POLL_OUTPUT (POLLOUT|POLLERR|POLLHUP|POLLNVAL)
 
-void io_loop_handle_add(struct ioloop *ioloop, int fd,
-			enum io_condition condition)
+void io_loop_handle_add(struct ioloop *ioloop, struct io *io)
 {
 	struct ioloop_handler_data *data = ioloop->handler_data;
+	enum io_condition condition = io->condition;
 	unsigned int old_size;
-	int index;
+	int index, fd = io->fd;
 
 	if ((unsigned int) fd >= data->idx_size) {
                 /* grow the fd -> index array */
@@ -97,11 +97,11 @@ void io_loop_handle_add(struct ioloop *i
 		data->fds[index].events |= IO_POLL_OUTPUT;
 }
 
-void io_loop_handle_remove(struct ioloop *ioloop, int fd,
-			   enum io_condition condition)
+void io_loop_handle_remove(struct ioloop *ioloop,  struct io *io)
 {
 	struct ioloop_handler_data *data = ioloop->handler_data;
-	int index;
+	enum io_condition condition = io->condition;
+	int index, fd = io->fd;
 
 	index = data->fd_index[fd];
 	i_assert(index >= 0 && (unsigned int) index < data->fds_size);
diff -urpNX /usr/share/dontdiff dovecot-1.0-test32.vanilla/src/lib/ioloop-select.c dovecot-1.0-test32/src/lib/ioloop-select.c
--- dovecot-1.0-test32.vanilla/src/lib/ioloop-select.c	2003-08-27 01:18:16.000000000 +0400
+++ dovecot-1.0-test32/src/lib/ioloop-select.c	2004-08-21 18:28:38.000000000 +0400
@@ -30,9 +30,11 @@ void io_loop_handler_deinit(struct ioloo
         p_free(ioloop->pool, ioloop->handler_data);
 }
 
-void io_loop_handle_add(struct ioloop *ioloop, int fd,
-			enum io_condition condition)
+void io_loop_handle_add(struct ioloop *ioloop, struct io *io)
 {
+	enum io_condition condition = io->condition;
+	int fd = io->fd;
+
 	i_assert(fd >= 0);
 
 	if (fd >= FD_SETSIZE)
@@ -44,9 +46,11 @@ void io_loop_handle_add(struct ioloop *i
 		FD_SET(fd, &ioloop->handler_data->write_fds);
 }
 
-void io_loop_handle_remove(struct ioloop *ioloop, int fd,
-			   enum io_condition condition)
+void io_loop_handle_remove(struct ioloop *ioloop, struct io *io)
 {
+	enum io_condition condition = io->condition;
+	int fd = io->fd;
+
 	i_assert(fd >= 0 && fd < FD_SETSIZE);
 
         if (condition & IO_READ)
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 189 bytes
Desc: Digital signature
URL: <http://dovecot.org/pipermail/dovecot/attachments/20040823/5f24daf9/attachment-0001.bin>


More information about the dovecot mailing list