[Dovecot] [PATCH] move iolist functions into separate file

Andrey Panin pazke at donpac.ru
Mon Oct 25 15:33:58 EEST 2004


Hello,

attached patch extracts iolist related functions into separate
file and makes it a little more generic. This functions will
be used by the new ioloop handler based on the BSD kqueue API.

Please consider applying.

Best regards.

-- 
Andrey Panin		| Linux and UNIX system administrator
pazke at donpac.ru		| PGP key: wwwkeys.pgp.net
-------------- next part --------------
diff -udrpNX /usr/share/dontdiff -x debian dovecot-1.0-test51.vanilla/src/lib/iolist.c dovecot-1.0-test51/src/lib/iolist.c
--- dovecot-1.0-test51.vanilla/src/lib/iolist.c	1970-01-01 03:00:00.000000000 +0300
+++ dovecot-1.0-test51/src/lib/iolist.c	2004-10-24 16:36:45.000000000 +0400
@@ -0,0 +1,56 @@
+
+#include "lib.h"
+#include "iolist.h"
+#include "ioloop-internal.h"
+
+int iolist_add(struct io_list *list, struct io *io)
+{
+	if ((io->condition & IO_READ) != 0) {
+		i_assert(list->ios[IOLIST_INPUT] == NULL);
+		list->ios[IOLIST_INPUT] = io;
+		return list->ios[IOLIST_OUTPUT] == NULL;
+	}
+	if ((io->condition & IO_WRITE) != 0) {
+		i_assert(list->ios[IOLIST_OUTPUT] == NULL);
+		list->ios[IOLIST_OUTPUT] = io;
+		return list->ios[IOLIST_INPUT] == NULL;
+	}
+
+	i_unreached();
+	return TRUE;
+}
+
+int iolist_del(struct io_list *list, struct io *io)
+{
+	if (list->ios[IOLIST_INPUT] == io) {
+		list->ios[IOLIST_INPUT] = NULL;
+		return list->ios[IOLIST_OUTPUT] == NULL;
+	}
+	if (list->ios[IOLIST_OUTPUT] == io) {
+		list->ios[IOLIST_OUTPUT] = NULL;
+		return list->ios[IOLIST_INPUT] == NULL;
+	}
+
+	i_unreached();
+	return TRUE;
+}
+
+int iolist_events(struct io_list *list, int rmask, int wmask)
+{
+	int events = 0, i;
+	struct io *io;
+
+	for (i = 0; i < IOLIST_IOS_PER_FD; i++) {
+		io = list->ios[i];
+
+		if (io == NULL)
+			continue;
+
+		if (io->condition & IO_READ)
+			events |= rmask;
+		if (io->condition & IO_WRITE)
+			events |= wmask;
+	}
+
+	return events;
+}
diff -udrpNX /usr/share/dontdiff -x debian dovecot-1.0-test51.vanilla/src/lib/iolist.h dovecot-1.0-test51/src/lib/iolist.h
--- dovecot-1.0-test51.vanilla/src/lib/iolist.h	1970-01-01 03:00:00.000000000 +0300
+++ dovecot-1.0-test51/src/lib/iolist.h	2004-10-24 16:36:57.000000000 +0400
@@ -0,0 +1,19 @@
+#ifndef __IOLIST_H
+#define __IOLIST_H
+
+enum {
+	IOLIST_INPUT,
+	IOLIST_OUTPUT,
+
+	IOLIST_IOS_PER_FD
+};
+
+struct io_list {
+	struct io *ios[IOLIST_IOS_PER_FD];
+};
+
+int iolist_add(struct io_list *list, struct io *io);
+int iolist_del(struct io_list *list, struct io *io);
+int iolist_events(struct io_list *list, int rmask, int wmask);
+
+#endif	/* __IOLIST_H */
diff -udrpNX /usr/share/dontdiff -x debian dovecot-1.0-test51.vanilla/src/lib/ioloop-epoll.c dovecot-1.0-test51/src/lib/ioloop-epoll.c
--- dovecot-1.0-test51.vanilla/src/lib/ioloop-epoll.c	2004-10-07 23:37:44.000000000 +0400
+++ dovecot-1.0-test51/src/lib/ioloop-epoll.c	2004-10-24 16:42:09.000000000 +0400
@@ -12,6 +12,7 @@
 /* @UNSAFE: whole file */
 
 #include "lib.h"
+#include "iolist.h"
 #include "ioloop-internal.h"
 
 #ifdef IOLOOP_EPOLL
@@ -21,13 +22,6 @@
 
 #define INITIAL_EPOLL_EVENTS	128
 
-enum {
-	EPOLL_LIST_INPUT,
-	EPOLL_LIST_OUTPUT,
-
-	EPOLL_IOS_PER_FD
-};
-
 struct ioloop_handler_data {
 	int epfd;
 	int events_size, events_pos;
@@ -37,10 +31,6 @@ struct ioloop_handler_data {
 	struct io_list **fd_index;
 };
 
-struct io_list {
-	struct io *ios[EPOLL_IOS_PER_FD];
-};
-
 void io_loop_handler_init(struct ioloop *ioloop)
 {
 	struct ioloop_handler_data *data;
@@ -74,58 +64,6 @@ void io_loop_handler_deinit(struct ioloo
 #define IO_EPOLL_INPUT	(EPOLLIN | EPOLLPRI | EPOLLERR | EPOLLHUP)
 #define IO_EPOLL_OUTPUT	(EPOLLOUT | EPOLLERR | EPOLLHUP)
 
-static int epoll_event_mask(struct io_list *list)
-{
-	int events = 0, i;
-	struct io *io;
-
-	for (i = 0; i < EPOLL_IOS_PER_FD; i++) {
-		io = list->ios[i];
-
-		if (io == NULL)
-			continue;
-
-		if (io->condition & IO_READ)
-			events |= IO_EPOLL_INPUT;
-		if (io->condition & IO_WRITE)
-			events |= IO_EPOLL_OUTPUT;
-	}
-
-	return events;
-}
-
-static int iolist_add(struct io_list *list, struct io *io)
-{
-	if ((io->condition & IO_READ) != 0) {
-		i_assert(list->ios[EPOLL_LIST_INPUT] == NULL);
-		list->ios[EPOLL_LIST_INPUT] = io;
-		return list->ios[EPOLL_LIST_OUTPUT] == NULL;
-	}
-	if ((io->condition & IO_WRITE) != 0) {
-		i_assert(list->ios[EPOLL_LIST_OUTPUT] == NULL);
-		list->ios[EPOLL_LIST_OUTPUT] = io;
-		return list->ios[EPOLL_LIST_INPUT] == NULL;
-	}
-
-	i_unreached();
-	return TRUE;
-}
-
-static int iolist_del(struct io_list *list, struct io *io)
-{
-	if (list->ios[EPOLL_LIST_INPUT] == io) {
-		list->ios[EPOLL_LIST_INPUT] = NULL;
-		return list->ios[EPOLL_LIST_OUTPUT] == NULL;
-	}
-	if (list->ios[EPOLL_LIST_OUTPUT] == io) {
-		list->ios[EPOLL_LIST_OUTPUT] = NULL;
-		return list->ios[EPOLL_LIST_INPUT] == NULL;
-	}
-
-	i_unreached();
-	return TRUE;
-}
-
 void io_loop_handle_add(struct ioloop *ioloop, struct io *io)
 {
 	struct ioloop_handler_data *data = ioloop->handler_data;
@@ -155,7 +93,7 @@ void io_loop_handle_add(struct ioloop *i
 	first = iolist_add(list, io);
 
 	event.data.ptr = list;
-	event.events = epoll_event_mask(list);
+	event.events = iolist_events(list, IO_EPOLL_INPUT, IO_EPOLL_OUTPUT);
 
 	op = first ? EPOLL_CTL_ADD : EPOLL_CTL_MOD;
 
@@ -184,7 +122,7 @@ void io_loop_handle_remove(struct ioloop
 	last = iolist_del(list, io);
 
 	event.data.ptr = list;
-	event.events = epoll_event_mask(list);
+	event.events = iolist_events(list, IO_EPOLL_INPUT, IO_EPOLL_OUTPUT);
 
 	op = last ? EPOLL_CTL_DEL : EPOLL_CTL_MOD;
 
@@ -224,7 +162,7 @@ void io_loop_handler_run(struct ioloop *
 	while (ret-- > 0) {
 		list = event->data.ptr;
 
-		for (i = 0; i < EPOLL_IOS_PER_FD; i++) {
+		for (i = 0; i < IOLIST_IOS_PER_FD; i++) {
 			io = list->ios[i];
 			if (io == NULL)
 				continue;
diff -udrpNX /usr/share/dontdiff -x debian dovecot-1.0-test51.vanilla/src/lib/Makefile.am dovecot-1.0-test51/src/lib/Makefile.am
--- dovecot-1.0-test51.vanilla/src/lib/Makefile.am	2004-10-05 19:28:42.000000000 +0400
+++ dovecot-1.0-test51/src/lib/Makefile.am	2004-10-24 16:35:44.000000000 +0400
@@ -31,6 +31,7 @@ liblib_a_SOURCES = \
 	ioloop-poll.c \
 	ioloop-select.c \
 	ioloop-epoll.c \
+	iolist.c \
 	lib.c \
 	lib-signals.c \
 	md4.c \
@@ -93,6 +94,7 @@ noinst_HEADERS = \
 	istream-internal.h \
 	ioloop.h \
 	ioloop-internal.h \
+	iolist.h \
 	lib.h \
 	lib-signals.h \
 	macros.h \
-------------- 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/20041025/5638bbe4/attachment-0001.bin>


More information about the dovecot mailing list