Alsa-Devel Archive on lore.kernel.org
 help / color / mirror / Atom feed
From: Vinod Koul <vinod.koul@intel.com>
To: Richard Fitzgerald <rf@opensource.wolfsonmicro.com>
Cc: alsa-devel@alsa-project.org,
	pierre-louis.bossart@linux.jf.intel.com,
	ckeepax@opensource.wolfsonmicro.com
Subject: Re: [tinycompress][PATCH 1/1] compress: Add non-blocking I/O
Date: Fri, 7 Jun 2013 06:06:58 +0530	[thread overview]
Message-ID: <20130607003658.GF23045@intel.com> (raw)
In-Reply-To: <20130605123100.GE21556@opensource.wolfsonmicro.com>

On Wed, Jun 05, 2013 at 01:31:00PM +0100, Richard Fitzgerald wrote:
> Support for non-blocking I/O, based on API of main alsalib.
> In non-blocking mode a compress_write() will return without
> blocking after it has written all bytes that will fit in the
> buffer and compress_read() will return after it has read all
> bytes available from the buffer. Use compress_wait() to wait
> for free write space or available read bytes.
> 
> Non-blocking mode is enabled and disabled using compress_nonblock().
Applied thanks, This is nicely done

--
~Vinod
> 
> Signed-off-by: Richard Fitzgerald <rf@opensource.wolfsonmicro.com>
> ---
>  compress.c                          |   34 ++++++++++++++++++++++++++++++++++
>  include/tinycompress/tinycompress.h |   23 ++++++++++++++++++++++-
>  2 files changed, 56 insertions(+), 1 deletions(-)
> 
> diff --git a/compress.c b/compress.c
> index bb68fa6..734fbbf 100644
> --- a/compress.c
> +++ b/compress.c
> @@ -88,6 +88,7 @@ struct compress {
>  	struct compr_config *config;
>  	int running;
>  	int max_poll_wait_ms;
> +	int nonblocking;
>  	unsigned int gapless_metadata;
>  	unsigned int next_track;
>  };
> @@ -372,6 +373,10 @@ int compress_write(struct compress *compress, const void *buf, unsigned int size
>  		 * or there is enough space for all remaining data
>  		 */
>  		if ((avail.avail < frag_size) && (avail.avail < size)) {
> +
> +			if (compress->nonblocking)
> +				return total;
> +
>  			ret = poll(&fds, 1, compress->max_poll_wait_ms);
>  			/* A pause will cause -EBADFD or zero.
>  			 * This is not an error, just stop writing */
> @@ -429,6 +434,9 @@ int compress_read(struct compress *compress, void *buf, unsigned int size)
>  			/* Less than one fragment available and not at the
>  			 * end of the read, so poll
>  			 */
> +			if (compress->nonblocking)
> +				return total;
> +
>  			ret = poll(&fds, 1, compress->max_poll_wait_ms);
>  			/* A pause will cause -EBADFD or zero.
>  			 * This is not an error, just stop reading */
> @@ -594,3 +602,29 @@ void compress_set_max_poll_wait(struct compress *compress, int milliseconds)
>  	compress->max_poll_wait_ms = milliseconds;
>  }
>  
> +void compress_nonblock(struct compress *compress, int nonblock)
> +{
> +	compress->nonblocking = !!nonblock;
> +}
> +
> +int compress_wait(struct compress *compress, int timeout_ms)
> +{
> +	struct pollfd fds;
> +	int ret;
> +
> +	fds.fd = compress->fd;
> +	fds.events = POLLOUT | POLLIN;
> +
> +	ret = poll(&fds, 1, timeout_ms);
> +	/* A pause will cause -EBADFD or zero. */
> +	if ((ret < 0) && (ret != -EBADFD))
> +		return oops(compress, errno, "poll error");
> +	if (fds.revents & (POLLOUT | POLLIN)) {
> +		return 0;
> +	}
> +	if (fds.revents & POLLERR) {
> +		return oops(compress, -EIO, "poll returned error!");
> +	}
> +	return ret;
> +}
> +
> diff --git a/include/tinycompress/tinycompress.h b/include/tinycompress/tinycompress.h
> index e947322..40de69a 100644
> --- a/include/tinycompress/tinycompress.h
> +++ b/include/tinycompress/tinycompress.h
> @@ -130,7 +130,15 @@ int compress_get_tstamp(struct compress *compress,
>  /*
>   * compress_write: write data to the compress stream
>   * return bytes written on success, negative on error
> - * this is a blocking call
> + * By default this is a blocking call and will not return
> + * until all bytes have been written or there was a
> + * write error.
> + * If non-blocking mode has been enabled with compress_nonblock(),
> + * this function will write all bytes that can be written without
> + * blocking and will then return the number of bytes successfully
> + * written. If the return value is not an error and is < size
> + * the caller can use compress_wait() to block until the driver
> + * is ready for more data.
>   *
>   * @compress: compress stream to be written to
>   * @buf: pointer to data
> @@ -141,6 +149,13 @@ int compress_write(struct compress *compress, const void *buf, unsigned int size
>  /*
>   * compress_read: read data from the compress stream
>   * return bytes read on success, negative on error
> + * By default this is a blocking call and will block until
> + * size bytes have been written or there was a read error.
> + * If non-blocking mode was enabled using compress_nonblock()
> + * the behaviour will change to read only as many bytes as
> + * are currently available (if no bytes are available it
> + * will return immediately). The caller can then use
> + * compress_wait() to block until more bytes are available.
>   *
>   * @compress: compress stream from where data is to be read
>   * @buf: pointer to data buffer
> @@ -242,6 +257,12 @@ bool is_codec_supported(unsigned int card, unsigned int device,
>   */
>  void compress_set_max_poll_wait(struct compress *compress, int milliseconds);
>  
> +/* Enable or disable non-blocking mode for write and read */
> +void compress_nonblock(struct compress *compress, int nonblock);
> +
> +/* Wait for ring buffer to ready for next read or write */
> +int compress_wait(struct compress *compress, int timeout_ms);
> +
>  int is_compress_running(struct compress *compress);
>  
>  int is_compress_ready(struct compress *compress);
> -- 
> 1.7.2.5
> 

-- 

  reply	other threads:[~2013-06-07  1:15 UTC|newest]

Thread overview: 4+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2013-06-05 12:28 [tinycompress][PATCH 0/2] Add support for non-blocking I/O Richard Fitzgerald
2013-06-05 12:31 ` [tinycompress][PATCH 1/1] compress: Add " Richard Fitzgerald
2013-06-07  0:36   ` Vinod Koul [this message]
2013-06-05 12:31 ` [tinycompress][PATCH 0/2] Add support for " Richard Fitzgerald

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20130607003658.GF23045@intel.com \
    --to=vinod.koul@intel.com \
    --cc=alsa-devel@alsa-project.org \
    --cc=ckeepax@opensource.wolfsonmicro.com \
    --cc=pierre-louis.bossart@linux.jf.intel.com \
    --cc=rf@opensource.wolfsonmicro.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox