[pulseaudio-discuss] [PATCH 2/2] pstream: Optimise read of smaller packages

Tanu Kaskinen tanuk at iki.fi
Mon Apr 8 09:27:01 PDT 2013


On Sun, 2013-04-07 at 11:59 +0200, David Henningsson wrote:
> On 04/05/2013 09:44 PM, David Henningsson wrote:
> > During a stream, most packets sent are either memblocks (with SHM info),
> > or requests for more data. These are only slightly bigger than the
> > header.
> >
> > This patch makes it possible to read these packages in one call to do_read,
> > thus saving us an extra poll syscall.
> >
> > Signed-off-by: David Henningsson <david.henningsson at canonical.com>
> > ---
> >   src/pulsecore/pstream.c |    8 ++++++++
> >   1 file changed, 8 insertions(+)
> >
> > diff --git a/src/pulsecore/pstream.c b/src/pulsecore/pstream.c
> > index d92178f..c6f1302 100644
> > --- a/src/pulsecore/pstream.c
> > +++ b/src/pulsecore/pstream.c
> > @@ -27,6 +27,7 @@
> >   #include <stdio.h>
> >   #include <stdlib.h>
> >   #include <unistd.h>
> > +#include <errno.h>
> >
> >   #ifdef HAVE_NETINET_IN_H
> >   #include <netinet/in.h>
> > @@ -652,6 +653,7 @@ static int do_read(pa_pstream *p) {
> >       pa_assert(p);
> >       pa_assert(PA_REFCNT_VALUE(p) > 0);
> >
> > +again:
> >       if (p->read.index < PA_PSTREAM_DESCRIPTOR_SIZE) {
> >           d = (uint8_t*) p->read.descriptor + p->read.index;
> >           l = PA_PSTREAM_DESCRIPTOR_SIZE - p->read.index;
> > @@ -774,6 +776,10 @@ static int do_read(pa_pstream *p) {
> >               }
> >           }
> >
> > +        /* Optimisation: See if we can read the payload too */
> > +        if ((p->read.data || p->read.memblock) && (r == PA_PSTREAM_DESCRIPTOR_SIZE))
> > +            goto again;
> > +
> >       } else if (p->read.index > PA_PSTREAM_DESCRIPTOR_SIZE) {
> >           /* Frame payload available */
> >
> > @@ -894,6 +900,8 @@ fail:
> 
> It's probably better to do:
> 
>   if (r == -1 && (errno == EAGAIN || errno == EWOULDBLOCK))
>      r = 0;
>   else
>      r = -1;
> 
> >       if (release_memblock)
> >           pa_memblock_release(release_memblock);
> >
> 
> return r;
> 
> That way we don't have to make the assumption that pa_memblock_release 
> can't destroy errno.

Yes.

I also have some reservations about using goto to backwards in a complex
function. I'm not sure, however, that using a proper loop structure
would make the code any more readable. Splitting the function into
smaller functions is something to consider, but I'm not demanding that
if you don't think it's a good idea.

-- 
Tanu



More information about the pulseaudio-discuss mailing list