[Dovecot] Fix for the kevent "Unrecognized event" problem.
John Wong
johnw at wonghome.net
Thu May 11 14:36:36 EEST 2006
i use openbsd/i386 + dovecot-cvs(10-may) + this patch,
my maillog still have kqueue error message like this:
Unrecognized event: kevent {.ident = 0, .filter = 0xffffffff, .flags =
0x8001, .fflags = 0x00000000, .data = 0x00000000}
thank you
Václav Haisman wrote:
> The attached patch should fix the problem with dying imap on
> "Unrecognized event". The problem is that when we register a handle for
> IO_ERROR only, we still can get readable/writable event without EV_EOF
> being set. This case was not handled.
>
> --
> Vaclav Haisman
>
> ------------------------------------------------------------------------
>
> *** ioloop-kqueue.c.~1.4.~ Tue May 2 14:36:56 2006
> --- ioloop-kqueue.c Tue May 9 21:29:33 2006
> ***************
> *** 74,80 ****
> {
> struct ioloop_handler_context *ctx = ioloop->handler_context;
> const int fd = io->fd;
> ! struct kevent ev = { fd, 0, EV_ADD | EV_EOF, 0, 0, NULL };
> enum io_condition condition = io->condition & MASK;
>
> i_assert(io->callback != NULL);
> --- 74,80 ----
> {
> struct ioloop_handler_context *ctx = ioloop->handler_context;
> const int fd = io->fd;
> ! struct kevent ev = { fd, 0, EV_ADD, 0, 0, NULL };
> enum io_condition condition = io->condition & MASK;
>
> i_assert(io->callback != NULL);
> ***************
> *** 184,190 ****
>
> i_assert(ctx->evbuf[i].ident < ctx->fds_size);
> if ((ctx->fds[ctx->evbuf[i].ident].mode & IO_ERROR) &&
> ! (ctx->evbuf[i].flags & EV_EOF)) {
> struct io *errio = ctx->fds[ctx->evbuf[i].ident].errio;
>
> t_id = t_push();
> --- 184,190 ----
>
> i_assert(ctx->evbuf[i].ident < ctx->fds_size);
> if ((ctx->fds[ctx->evbuf[i].ident].mode & IO_ERROR) &&
> ! (ctx->evbuf[i].flags & (EV_EOF | EV_ERROR))) {
> struct io *errio = ctx->fds[ctx->evbuf[i].ident].errio;
>
> t_id = t_push();
> ***************
> *** 203,216 ****
> " in I/O handler %p",
> (void *)io->callback);
> }
> } else
> i_panic("Unrecognized event: kevent {.ident = %u,"
> " .filter = 0x%04x,"
> " .flags = 0x%04x,"
> " .fflags = 0x%08x,"
> ! " .data = 0x%08x}", ctx->evbuf[i].ident,
> ctx->evbuf[i].filter, ctx->evbuf[i].flags,
> ! ctx->evbuf[i].fflags, ctx->evbuf[i].data);
> }
> }
>
> --- 203,224 ----
> " in I/O handler %p",
> (void *)io->callback);
> }
> + } else if (ctx->fds[ctx->evbuf[i].ident].mode & IO_ERROR) {
> + /*
> + NO-OP. If the handle is registered only for
> + IO_ERROR, then we can get readable/writable event
> + but no IO_READ | IO_WRITE set.
> + */
> } else
> i_panic("Unrecognized event: kevent {.ident = %u,"
> " .filter = 0x%04x,"
> " .flags = 0x%04x,"
> " .fflags = 0x%08x,"
> ! " .data = 0x%08x}\n"
> ! "mode: 0x%x04x", ctx->evbuf[i].ident,
> ctx->evbuf[i].filter, ctx->evbuf[i].flags,
> ! ctx->evbuf[i].fflags, ctx->evbuf[i].data,
> ! ctx->fds[ctx->evbuf[i].ident].mode);
> }
> }
>
>
More information about the dovecot
mailing list