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

David Henningsson david.henningsson at canonical.com
Sun Apr 7 02:59:58 PDT 2013


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.


> +    if (r == -1 && (errno == EAGAIN || errno == EWOULDBLOCK))
> +        return 0; /* Let's just try again later, when socket is readable. */
>       return -1;
>   }
>
>



-- 
David Henningsson, Canonical Ltd.
https://launchpad.net/~diwic


More information about the pulseaudio-discuss mailing list