ioloop-iolist.c revision 8b6f56900570900cf7eb0282ff7d7885c4316dfa
5f5870385cff47efd2f58e7892f251cf13761528Timo Sirainen/*
a64adf62fa33f2463a86f990217b0c9078531a40Timo Sirainen * Copyright (c) 2004 Andrey Panin <pazke@donpac.ru>
46552a931924c2d743f045e95b08c3ce6beda91aTimo Sirainen *
ed4cdfe5847a6063d5a4684a6a47b17e943922b5Timo Sirainen * This software is released under the MIT license.
ed4cdfe5847a6063d5a4684a6a47b17e943922b5Timo Sirainen */
a64adf62fa33f2463a86f990217b0c9078531a40Timo Sirainen
5d03d9f439e41c90215a3c938ffebe4c2a8ae257Timo Sirainen#include "lib.h"
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainen#include "ioloop-internal.h"
5d03d9f439e41c90215a3c938ffebe4c2a8ae257Timo Sirainen#include "ioloop-iolist.h"
a64adf62fa33f2463a86f990217b0c9078531a40Timo Sirainen
a64adf62fa33f2463a86f990217b0c9078531a40Timo Sirainenbool ioloop_iolist_add(struct io_list *list, struct io_file *io)
a64adf62fa33f2463a86f990217b0c9078531a40Timo Sirainen{
a64adf62fa33f2463a86f990217b0c9078531a40Timo Sirainen int i, idx;
a64adf62fa33f2463a86f990217b0c9078531a40Timo Sirainen
d63b4241643b6014d49ff356f14e0f3ee43068a8Timo Sirainen if ((io->io.condition & IO_READ) != 0)
b215a8a123623782554a83f3025ef4e771bd8f01Timo Sirainen idx = IOLOOP_IOLIST_INPUT;
a64adf62fa33f2463a86f990217b0c9078531a40Timo Sirainen else if ((io->io.condition & IO_WRITE) != 0)
a64adf62fa33f2463a86f990217b0c9078531a40Timo Sirainen idx = IOLOOP_IOLIST_OUTPUT;
a64adf62fa33f2463a86f990217b0c9078531a40Timo Sirainen else if ((io->io.condition & IO_ERROR) != 0)
a64adf62fa33f2463a86f990217b0c9078531a40Timo Sirainen idx = IOLOOP_IOLIST_ERROR;
7744586e3e0fd60158abfbb03a233d3bd8d6c48bTimo Sirainen else {
a64adf62fa33f2463a86f990217b0c9078531a40Timo Sirainen i_unreached();
ed4cdfe5847a6063d5a4684a6a47b17e943922b5Timo Sirainen }
a64adf62fa33f2463a86f990217b0c9078531a40Timo Sirainen
a64adf62fa33f2463a86f990217b0c9078531a40Timo Sirainen if (list->ios[idx] != NULL) {
79977d368df2efc3f3dc0bbb260748b076538103Timo Sirainen i_panic("io_add(0x%x) called twice fd=%d, callback=%p -> %p",
5733207dc3ec10e6e5a6e0a8b30fbd1b061062b9Timo Sirainen io->io.condition, io->fd, list->ios[idx]->io.callback,
a64adf62fa33f2463a86f990217b0c9078531a40Timo Sirainen io->io.callback);
a64adf62fa33f2463a86f990217b0c9078531a40Timo Sirainen }
277c0eea825eec176cddc029af68f5a4d942e16eTimo Sirainen i_assert(list->ios[idx] == NULL);
02a0492affdff138f43903c19ca366363923044dTimo Sirainen list->ios[idx] = io;
02a0492affdff138f43903c19ca366363923044dTimo Sirainen
a64adf62fa33f2463a86f990217b0c9078531a40Timo Sirainen /* check if this was the first one */
a64adf62fa33f2463a86f990217b0c9078531a40Timo Sirainen for (i = 0; i < IOLOOP_IOLIST_IOS_PER_FD; i++) {
ec892704d6a9625195fbb4087edeb04bc463d4ffTimo Sirainen if (i != idx && list->ios[i] != NULL)
a64adf62fa33f2463a86f990217b0c9078531a40Timo Sirainen return FALSE;
f45da0b456f0f1540c221f9fdc7d8f7b93400782Timo Sirainen }
f45da0b456f0f1540c221f9fdc7d8f7b93400782Timo Sirainen
58080063fab18a22e05987339376b52b09f3a256Timo Sirainen return TRUE;
a64adf62fa33f2463a86f990217b0c9078531a40Timo Sirainen}
434abef12f61881a5cfa28d27193d0854a9639a0Timo Sirainen
434abef12f61881a5cfa28d27193d0854a9639a0Timo Sirainenbool ioloop_iolist_del(struct io_list *list, struct io_file *io)
a64adf62fa33f2463a86f990217b0c9078531a40Timo Sirainen{
a64adf62fa33f2463a86f990217b0c9078531a40Timo Sirainen bool last = TRUE;
a64adf62fa33f2463a86f990217b0c9078531a40Timo Sirainen int i;
b11269887905780bc8cb7762bbb157aa59961cacTimo Sirainen
a64adf62fa33f2463a86f990217b0c9078531a40Timo Sirainen for (i = 0; i < IOLOOP_IOLIST_IOS_PER_FD; i++) {
a64adf62fa33f2463a86f990217b0c9078531a40Timo Sirainen if (list->ios[i] != NULL) {
a64adf62fa33f2463a86f990217b0c9078531a40Timo Sirainen if (list->ios[i] == io)
6c2ce1d5bf17b21e804a079eb0f973b7ab83e0d8Timo Sirainen list->ios[i] = NULL;
a64adf62fa33f2463a86f990217b0c9078531a40Timo Sirainen else
a64adf62fa33f2463a86f990217b0c9078531a40Timo Sirainen last = FALSE;
a64adf62fa33f2463a86f990217b0c9078531a40Timo Sirainen }
a64adf62fa33f2463a86f990217b0c9078531a40Timo Sirainen }
7744586e3e0fd60158abfbb03a233d3bd8d6c48bTimo Sirainen return last;
7bafda1813454621e03615e83d55bccfa7cc56bdTimo Sirainen}
7bafda1813454621e03615e83d55bccfa7cc56bdTimo Sirainen