On 20/07/2015 04:27, Fam Zheng wrote: > For aio-posix, how about keeping the optimization local which doesn't need > atomic operation? (no idea for win32 :) > > diff --git a/aio-posix.c b/aio-posix.c > index 5c8b266..7e98123 100644 > --- a/aio-posix.c > +++ b/aio-posix.c > @@ -236,6 +236,7 @@ bool aio_poll(AioContext *ctx, bool blocking) > int i, ret; > bool progress; > int64_t timeout; > + int aio_notifier_idx = -1; > > aio_context_acquire(ctx); > progress = false; > @@ -256,11 +257,18 @@ bool aio_poll(AioContext *ctx, bool blocking) > assert(npfd == 0); > > /* fill pollfds */ > + i = 0; > QLIST_FOREACH(node, &ctx->aio_handlers, node) { > if (!node->deleted && node->pfd.events) { > add_pollfd(node); > + if (node->pfd.fd == event_notifier_get_fd(&ctx->notifier)) { > + assert(aio_notifier_idx == -1); > + aio_notifier_idx = i; > + } > + i++; > } > }
That's a good idea. Since aio_set_fd_handler uses QLIST_INSERT_HEAD, perhaps we can be sure that aio_notifier_idx is always the last one (i.e. i-1)? And the same can be done on Windows, I think. > + if (pollfds[aio_notifier_idx].revents & (G_IO_IN | G_IO_HUP | G_IO_ERR)) > { > + event_notifier_test_and_clear(&ctx->notifier); > + } Might as well zero pollfds[aio_notifier_idx].revents after clearing it. The atomic operation is not too expensive, so it would really be more about simplicity than about speed. Not that simplicity is a bad thing! I'll send v2 of the first patch, you can look at doing the optimization. Thanks! Paolo