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

Re: poll() emulation in git

From
Paolo Bonzini <bonzini@gnu.org>
Date
Sep 6, 2012, 14:31 UTC
Message-ID
<5048B3D0.2070809@gnu.org>
In-Reply-To
<010301cd8c38$4256bb90$c70432b0$@schmitz-digital.de>
Il 06/09/2012 16:02, Joachim Schmitz ha scritto:
Show 14 quoted lines
> 
> But is there something that could be done to make git work even without poll()?
> It is used in 5 places:
> 
> $ grep -n poll\( *.c */*.c
> credential-cache--daemon.c:175: if (poll(&pfd, 1, 1000 * wakeup) < 0) {
> daemon.c:1018:          if (poll(pfd, socklist->nr, -1) < 0) {
> help.c:361:                     poll(NULL, 0, autocorrect * 100);
> upload-pack.c:232:              if (poll(pfd, pollsize, -1) < 0) {
> builtin/upload-archive.c:125:           if (poll(pfd, 2, -1) < 0) {
> 
> Don't quite understand why in help.c it has that NULL, which should always result in an EFAULT and other than that basically is a
> NOP (at least in the poll() emulation)? Seems a usleep(autocorrect * 100) is meant to happen here instead?
> So I think here a poll() isn't needed at all. But also the 'broken' one shouldn't harm too much.

Yes, it's an usleep(autocorrect * 100000) basically (poll takes milliseconds, not micro).

Show 31 quoted lines
> ...
> # else
>       char data[64];
>       r = recv (fd, data, sizeof (data), MSG_PEEK);
>       socket_errno = (r < 0) ? errno : 0;
> # endif
>       if (r == 0)
>         happened |= POLLHUP;
> 
>       /* If the event happened on an unconnected server socket,
>          that's fine. */
>       else if (r > 0 || ( /* (r == -1) && */ socket_errno == ENOTCONN))
>         happened |= (POLLIN | POLLRDNORM) & sought;
> 
>       /* Distinguish hung-up sockets from other errors.  */
>       else if (socket_errno == ESHUTDOWN || socket_errno == ECONNRESET
>                || socket_errno == ECONNABORTED || socket_errno == ENETRESET)
>         happened |= POLLHUP;
> 
> #ifdef __TANDEM /* as we can't recv(...,MSG_PEEK) on a non-socket */
>       else if (socket_errno == ENOTSOCK)
>         happened |= (POLLIN | POLLRDNORM) & sought;
> #endif
>       else
>         happened |= POLLERR;
>     }
> ...
> 
> We won't detect POLLHUP that way I think. However it seems to work, we've been able to clone, push, pull, branch that way with
> NonStop being the (ssh-)server, something that didn't work at all without that hack (and yes, I believe it is just that).
> Someone in for a cleaner way of managing this?

I suppose it works to always handle ENOTSOCK that way, even on non-__TANDEM systems.

Paolo
Previous: Joachim SchmitzNext: Joachim Schmitz
Message 9 of 14 in “RE: poll() emulation in git”
  1. Joachim SchmitzSep 5, 2012
  2. Bastien ROUCARIESSep 5, 2012
  3. Joachim SchmitzSep 5, 2012
  4. Paolo BonziniSep 5, 2012
  5. Joachim SchmitzSep 5, 2012
  6. Joachim SchmitzSep 5, 2012
  7. Paolo BonziniSep 5, 2012
  8. Joachim SchmitzSep 6, 2012
  9. Paolo BonziniSep 6, 2012
  10. Joachim SchmitzSep 6, 2012
  11. Paolo BonziniSep 6, 2012
  12. Joachim SchmitzSep 7, 2012
  13. Joachim SchmitzSep 7, 2012
  14. Paolo BonziniSep 7, 2012

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.