From 35aeae0170224db63c4408e46684bc15c2bb885c Mon Sep 17 00:00:00 2001 From: Anthony Minessale Date: Wed, 1 Oct 2014 18:10:56 -0500 Subject: [PATCH] FS-6822 #comment The code in question appears to have been added by me (18f20e24). I think this patch is the correct solution. --- libs/sofia-sip/.update | 2 +- .../sofia-sip/libsofia-sip-ua/su/sofia-sip/su.h | 2 +- libs/sofia-sip/libsofia-sip-ua/su/su.c | 17 ++++++++--------- 3 files changed, 10 insertions(+), 11 deletions(-) diff --git a/libs/sofia-sip/.update b/libs/sofia-sip/.update index 31d9a658f9..c3f2b72bea 100644 --- a/libs/sofia-sip/.update +++ b/libs/sofia-sip/.update @@ -1 +1 @@ -Tue Sep 30 20:32:49 CDT 2014 +Wed Oct 1 18:09:52 CDT 2014 diff --git a/libs/sofia-sip/libsofia-sip-ua/su/sofia-sip/su.h b/libs/sofia-sip/libsofia-sip-ua/su/sofia-sip/su.h index a1b2813d2d..4c471e4df2 100644 --- a/libs/sofia-sip/libsofia-sip-ua/su/sofia-sip/su.h +++ b/libs/sofia-sip/libsofia-sip-ua/su/sofia-sip/su.h @@ -316,7 +316,7 @@ SOFIAPUBFUN int su_getlocalip(su_sockaddr_t *sin); * and which was missing from WINSOCK */ #define su_is_blocking(e) \ - ((e) == EINPROGRESS || (e) == EAGAIN || (e) == EWOULDBLOCK) +((e) == EINPROGRESS || (e) == EAGAIN || (e) == EWOULDBLOCK || (e) == EINTR) #endif #if SU_HAVE_WINSOCK diff --git a/libs/sofia-sip/libsofia-sip-ua/su/su.c b/libs/sofia-sip/libsofia-sip-ua/su/su.c index b2de1b3e8f..7bc2c00b3e 100644 --- a/libs/sofia-sip/libsofia-sip-ua/su/su.c +++ b/libs/sofia-sip/libsofia-sip-ua/su/su.c @@ -511,25 +511,26 @@ issize_t su_vrecv(su_socket_t s, su_iovec_t iov[], isize_t iovlen, int flags, #else - +#include issize_t su_vsend(su_socket_t s, su_iovec_t const iov[], isize_t iovlen, int flags, su_sockaddr_t const *su, socklen_t sulen) { struct msghdr hdr[1] = {{0}}; - int rv; + issize_t rv; + int sanity = 100; hdr->msg_name = (void *)su; hdr->msg_namelen = sulen; hdr->msg_iov = (struct iovec *)iov; hdr->msg_iovlen = iovlen; - + do { if ((rv = sendmsg(s, hdr, flags)) == -1) { - if (errno == EAGAIN) usleep(1000); + if (errno == EAGAIN) sched_yield(); } - } while (rv == -1 && (errno == EAGAIN || errno == EINTR)); - + } while (--sanity > 0 && rv == -1 && (errno == EAGAIN || errno == EINTR)); + return rv; } @@ -545,9 +546,7 @@ issize_t su_vrecv(su_socket_t s, su_iovec_t iov[], isize_t iovlen, int flags, hdr->msg_iov = (struct iovec *)iov; hdr->msg_iovlen = iovlen; - do { - retval = recvmsg(s, hdr, flags); - } while (retval == -1 && errno == EINTR); + retval = recvmsg(s, hdr, flags); if (su && sulen) *sulen = hdr->msg_namelen;