[ovs-dev] [threads v2 10/13] async-append: New library to allow asynchronous appending to a log file.
Ben Pfaff
blp at nicira.com
Thu Jul 18 21:41:23 UTC 2013
On Wed, Jul 17, 2013 at 03:33:38PM -0700, Alex Wang wrote:
> 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?
That's right, that would be a bug.
> > +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'?
That's right too. (Do you see a mistake here regarding that rule?)
Thanks,
Ben.
More information about the dev
mailing list