[PATCH 2/2] Quickly retry sendmsg or recvmsg if errno is EAGAIN or EINTR.
Ken Thomases
ken at codeweavers.com
Sun Feb 23 04:23:44 CST 2014
On Feb 21, 2014, at 6:35 PM, mtewoodbury at gmail.com wrote:
> Note that this greatly improves network reliability.
How did you determine that? How could we confirm that?
> - if ( (n = recvmsg(fd, &hdr, wsa->flags)) == -1 )
> + n = recvmsg(fd, &hdr, wsa->flags);
> + if (n == -1 && (errno == EINTR || errno == EAGAIN))
> + n = recvmsg(fd, &hdr, wsa->flags);
> + if (n == -1)
> +
> return -1;
What's with that blank line between the last "if" and its corresponding statement?
> - if (ret >= 0)
> - {
> + if (ret == -1 && (errno == EINTR || errno == EAGAIN))
> + ret = sendmsg(fd, &hdr, wsa->flags); /* Try it again quickly */
> + if (ret >= 0) {
Why did you change the existing lines? You could have just added your two lines.
In general:
Is this actually the second patch of a two-patch series as indicated by the "[PATCH 2/2]" in the subject? I didn't receive the first patch.
Have you tested to see if just retrying on EINTR is sufficient to improve the reliability? EAGAIN is not typically a situation where an immediate retry helps.
The callers of WS2_recv() and WS2_send() already have tests for EINTR and EAGAIN. The strategy for dealing with those should probably exist in just one place. For my part, I think that all interruptible syscalls should be in a loop that immediately retries for EINTR, but EAGAIN should usually go back to some select(), poll(), kevent() or similar wait function.
-Ken
More information about the wine-devel
mailing list