Hey Ben,
Looks good to me, thanks,
few inline questions below,
+static bool
> +async_append_is_full(const struct async_append *ap)
> +{
> + return (ap->aiocb_head - ap->aiocb_tail >= MAX_CBS
> + || byteq_is_full(&ap->byteq));
> +}
>
Just make sure, "ap->aiocb_head - ap->aiocb_tail > MAX_CBS" won't happen,
right?
> +void
+async_append_write(struct async_append *ap, const void *data_, size_t size)
> +{
> + const uint8_t *data = data_;
> +
> + if (!async_append_enabled) {
> + ignore(write(ap->fd, data, size));
> + return;
> + }
> +
> + while (size > 0) {
> + struct aiocb *aiocb;
> + size_t chunk_size;
> + void *chunk;
> +
> + while (async_append_is_full(ap)) {
> + async_append_wait(ap);
> + }
> +
> + chunk = byteq_head(&ap->byteq);
> + chunk_size = byteq_headroom(&ap->byteq);
> + if (chunk_size > size) {
> + chunk_size = size;
> + }
> + memcpy(chunk, data, chunk_size);
> +
> + aiocb = &ap->aiocbs[ap->aiocb_head & (MAX_CBS - 1)];
> + memset(aiocb, 0, sizeof *aiocb);
> + aiocb->aio_fildes = ap->fd;
> + aiocb->aio_offset = 0;
> + aiocb->aio_buf = chunk;
> + aiocb->aio_nbytes = chunk_size;
> + aiocb->aio_sigevent.sigev_notify = SIGEV_NONE;
> + if (aio_write(aiocb) == -1) {
> + async_append_flush(ap);
> + ignore(write(ap->fd, data, size));
> + return;
> + }
> +
> + data += chunk_size;
> + size -= chunk_size;
> + byteq_advance_head(&ap->byteq, chunk_size);
> + ap->aiocb_head++;
> + }
> +}
>
Is there requirement that the "* data_" must not be free'ed before
asynchronously written to 'fd'?
> --
> 1.7.2.5
>
> _______________________________________________
> dev mailing list
> [email protected]
> http://openvswitch.org/mailman/listinfo/dev
>
_______________________________________________
dev mailing list
[email protected]
http://openvswitch.org/mailman/listinfo/dev