git/list[1] front-page[2] threads[3] people[4] search[5] about
 

Re: [PATCHv3 03/13] xread_nonblock: add functionality to read from fds nonblockingly

From
Junio C Hamano <gitster@pobox.com>
Date
Sep 22, 2015, 00:02 UTC
Message-ID
<xmqqwpvj7240.fsf@gitster.mtv.corp.google.com>
In-Reply-To
<1442875159-13027-4-git-send-email-sbeller@google.com>
Stefan Beller <sbeller@google.com> writes:
Show 34 quoted lines
> This wrapper just restarts on EINTR, but not on EAGAIN like xread
> does. This gives less guarantees on the actual reading rather than
> on returning fast.
>
> Signed-off-by: Stefan Beller <sbeller@google.com>
> ---
>  git-compat-util.h |  1 +
>  wrapper.c         | 22 ++++++++++++++++++++++
>  2 files changed, 23 insertions(+)
>
> diff --git a/git-compat-util.h b/git-compat-util.h
> index c6d391f..9ccea85 100644
> --- a/git-compat-util.h
> +++ b/git-compat-util.h
> @@ -718,6 +718,7 @@ extern void *xcalloc(size_t nmemb, size_t size);
>  extern void *xmmap(void *start, size_t length, int prot, int flags, int fd, off_t offset);
>  extern void *xmmap_gently(void *start, size_t length, int prot, int flags, int fd, off_t offset);
>  extern ssize_t xread(int fd, void *buf, size_t len);
> +extern ssize_t xread_nonblock(int fd, void *buf, size_t len);
>  extern ssize_t xwrite(int fd, const void *buf, size_t len);
>  extern ssize_t xpread(int fd, void *buf, size_t len, off_t offset);
>  extern int xdup(int fd);
> diff --git a/wrapper.c b/wrapper.c
> index 50267a4..54ce231 100644
> --- a/wrapper.c
> +++ b/wrapper.c
> @@ -223,6 +223,28 @@ ssize_t xread(int fd, void *buf, size_t len)
>  }
>  
>  /*
> + * xread_nonblock() is the same a read(), but it automatically restarts read()
> + * interrupted operations (EINTR). xread_nonblock() DOES NOT GUARANTEE that
> + * "len" bytes is read even if the data is available.
> + */

This comment is somewhat misleading to readers who knew there was xread() and this new one is a variant of it. xread() does not say anything about "if the data is available" (it just blocks and insists reading that much if the data is not ready yet). If we drop the "even if ..." from the end, that confusion would be avoided.

Turning EWOULDBLOCK to EAGAIN is a very useful thing to help the callers, and it deserves to be described in the above comment.

Show 5 quoted lines
> +ssize_t xread_nonblock(int fd, void *buf, size_t len)
> +{
> +	ssize_t nr;
> +	if (len > MAX_IO_SIZE)
> +	    len = MAX_IO_SIZE;
This line is under-indented?
Show 16 quoted lines
> +	while (1) {
> +		nr = read(fd, buf, len);
> +		if (nr < 0) {
> +			if (errno == EINTR)
> +				continue;
> +			if (errno == EWOULDBLOCK)
> +				errno = EAGAIN;
> +		}
> +		return nr;
> +	}
> +}
> +
> +/*
>   * xwrite() is the same a write(), but it automatically restarts write()
>   * operations with a recoverable error (EAGAIN and EINTR). xwrite() DOES NOT
>   * GUARANTEE that "len" bytes is written even if the operation is successful.
Previous: Stefan BellerNext: Junio C Hamano
Message 21 of 48 in “[PATCHv3 00/13] fetch submodules in parallel and a preview on parallel "submodule update"”
  1. Stefan BellerSep 21, 2015
  2. 01/13 Sending "Fetching submodule <foo>" output to stderrStefan Beller, Sep 21, 2015
  3. Junio C HamanoSep 21, 2015
  4. 02/13 xread: poll on non blocking fdsStefan Beller, Sep 21, 2015
  5. Junio C HamanoSep 21, 2015
  6. Torsten BögershausenSep 22, 2015
  7. Jacob KellerSep 22, 2015
  8. Torsten BögershausenSep 22, 2015
  9. Junio C HamanoSep 22, 2015
  10. Jeff KingSep 22, 2015
  11. Junio C HamanoSep 22, 2015
  12. Stefan BellerSep 23, 2015
  13. Junio C HamanoSep 23, 2015
  14. Jeff KingSep 23, 2015
  15. Eric SunshineSep 21, 2015
  16. Junio C HamanoSep 22, 2015
  17. Stefan BellerSep 22, 2015
  18. Junio C HamanoSep 22, 2015
  19. Stefan BellerSep 22, 2015
  20. 03/13 xread_nonblock: add functionality to read from fds nonblockinglyStefan Beller, Sep 21, 2015
  21. Junio C HamanoSep 22, 2015
  22. Junio C HamanoSep 22, 2015
  23. Jacob KellerSep 22, 2015
  24. Jacob KellerSep 22, 2015
  25. Junio C HamanoSep 22, 2015
  26. 04/13 strbuf: add strbuf_read_once to read without blockingStefan Beller, Sep 21, 2015
  27. Junio C HamanoSep 22, 2015
  28. Jacob KellerSep 22, 2015
  29. 05/13 run-command: factor out return value computationStefan Beller, Sep 21, 2015
  30. Junio C HamanoSep 22, 2015
  31. 06/13 run-command: add an asynchronous parallel child processorStefan Beller, Sep 21, 2015
  32. Junio C HamanoSep 22, 2015
  33. Stefan BellerSep 22, 2015
  34. Junio C HamanoSep 22, 2015
  35. Stefan BellerSep 22, 2015
  36. Junio C HamanoSep 22, 2015
  37. Stefan BellerSep 22, 2015
  38. Junio C HamanoSep 22, 2015
  39. 07/13 fetch_populated_submodules: use new parallel job processingStefan Beller, Sep 21, 2015
  40. Junio C HamanoSep 22, 2015
  41. 08/13 submodules: allow parallel fetching, add tests and documentationStefan Beller, Sep 21, 2015
  42. 09/13 submodule config: keep update strategy aroundStefan Beller, Sep 21, 2015
  43. Eric SunshineSep 22, 2015
  44. Stefan BellerSep 22, 2015
  45. 10/13 git submodule update: cmd_update_recursiveStefan Beller, Sep 21, 2015
  46. 11/13 git submodule update: cmd_update_cloneStefan Beller, Sep 21, 2015
  47. 12/13 git submodule update: cmd_update_fetchStefan Beller, Sep 21, 2015
  48. 13/13 Rewrite submodule update in CStefan Beller, Sep 21, 2015

Read the whole thread, see it on lore, or plain text.

$ cat FOOTERMessages come from the public archive at lore.kernel.org/git, fetched every hour. The front page is chosen and written each morning by an AI editor and can be wrong; the threads themselves are the record. About and API. For agents: an MCP server at https://gitlist.dev/mcp, and any thread, story or person page as Markdown by adding .md to its URL (or sending Accept: text/markdown). Details in /llms.txt.