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;