From: Andrew Deason Date: Fri, 7 Sep 2012 21:58:05 +0000 (-0500) Subject: rx: Process error queue after noticing errors X-Git-Tag: upstream/1.8.0_pre1^2~1930 X-Git-Url: https://git.michaelhowe.org/gitweb/?a=commitdiff_plain;h=cddd859d2a6a05a01c971c23dba0b43eceb6b93b;p=packages%2Fo%2Fopenafs.git rx: Process error queue after noticing errors If errors exist in the socket error queue, we will notice by a sendmsg or recvmsg returning an error. If we never get an error, we don't need to check the error queue. So, only call osi_HandleSocketError after such an error has been returned, so we can avoid unnecessarily checking the error queue when there are no errors. Change-Id: I7c8aaaac42728dac7fb0634538b8cc317f0e7212 Reviewed-on: http://gerrit.openafs.org/8114 Reviewed-by: Chas Williams - CONTRACTOR Tested-by: BuildBot Reviewed-by: Derrick Brashear Reviewed-by: Simon Wilkinson --- diff --git a/src/rx/LINUX/rx_knet.c b/src/rx/LINUX/rx_knet.c index 5d2fc4a63..48a493d24 100644 --- a/src/rx/LINUX/rx_knet.c +++ b/src/rx/LINUX/rx_knet.c @@ -170,10 +170,6 @@ osi_NetSend(osi_socket sop, struct sockaddr_in *to, struct iovec *iovec, struct msghdr msg; int code; -#ifdef AFS_RXERRQ_ENV - while (osi_HandleSocketError(sop)) - ; -#endif msg.msg_name = to; msg.msg_namelen = sizeof(*to); @@ -182,6 +178,14 @@ osi_NetSend(osi_socket sop, struct sockaddr_in *to, struct iovec *iovec, msg.msg_flags = 0; code = kernel_sendmsg(sop, &msg, (struct kvec *) iovec, iovcnt, size); + +#ifdef AFS_RXERRQ_ENV + if (code < 0) { + while (osi_HandleSocketError(sop)) + ; + } +#endif + return (code < 0) ? code : 0; } @@ -220,11 +224,6 @@ osi_NetReceive(osi_socket so, struct sockaddr_in *from, struct iovec *iov, osi_Panic("Too many (%d) iovecs passed to osi_NetReceive\n", iovcnt); } -#ifdef AFS_RXERRQ_ENV - while (osi_HandleSocketError(so)) - ; -#endif - memcpy(tmpvec, iov, iovcnt * sizeof(struct iovec)); msg.msg_name = from; msg.msg_iov = tmpvec; @@ -245,6 +244,11 @@ osi_NetReceive(osi_socket so, struct sockaddr_in *from, struct iovec *iov, flush_signals(current); /* We don't want no stinkin' signals. */ rxk_lastSocketError = code; rxk_nSocketErrors++; + +#ifdef AFS_RXERRQ_ENV + while (osi_HandleSocketError(so)) + ; +#endif } else { *lengthp = code; code = 0; diff --git a/src/rx/rx_lwp.c b/src/rx/rx_lwp.c index fe9bdceef..fa4ee6dc4 100644 --- a/src/rx/rx_lwp.c +++ b/src/rx/rx_lwp.c @@ -412,11 +412,17 @@ rxi_Listen(osi_socket sock) int rxi_Recvmsg(osi_socket socket, struct msghdr *msg_p, int flags) { + int code; + code = recvmsg(socket, msg_p, flags); + #ifdef AFS_RXERRQ_ENV - while((rxi_HandleSocketError(socket)) > 0) - ; + if (code < 0) { + while((rxi_HandleSocketError(socket)) > 0) + ; + } #endif - return recvmsg(socket, msg_p, flags); + + return code; } /* diff --git a/src/rx/rx_pthread.c b/src/rx/rx_pthread.c index a1af2b42e..9dcb9f79c 100644 --- a/src/rx/rx_pthread.c +++ b/src/rx/rx_pthread.c @@ -393,11 +393,15 @@ int rxi_Recvmsg(osi_socket socket, struct msghdr *msg_p, int flags) { int ret; + ret = recvmsg(socket, msg_p, flags); + #ifdef AFS_RXERRQ_ENV - while((rxi_HandleSocketError(socket)) > 0) - ; + if (ret < 0) { + while (rxi_HandleSocketError(socket) > 0) + ; + } #endif - ret = recvmsg(socket, msg_p, flags); + return ret; } @@ -409,26 +413,36 @@ rxi_Sendmsg(osi_socket socket, struct msghdr *msg_p, int flags) { int ret; ret = sendmsg(socket, msg_p, flags); -#ifdef AFS_LINUX22_ENV + +#ifdef AFS_RXERRQ_ENV + if (ret < 0) { + while (rxi_HandleSocketError(socket) > 0) + ; + } + return ret; + +#else +# ifdef AFS_LINUX22_ENV /* linux unfortunately returns ECONNREFUSED if the target port * is no longer in use */ /* and EAGAIN if a UDP checksum is incorrect */ if (ret == -1 && errno != ECONNREFUSED && errno != EAGAIN) { -#else +# else if (ret == -1) { -#endif +# endif dpf(("rxi_sendmsg failed, error %d\n", errno)); fflush(stdout); -#ifndef AFS_NT40_ENV +# ifndef AFS_NT40_ENV if (errno > 0) return -errno; -#else +# else if (WSAGetLastError() > 0) return -WSAGetLastError(); -#endif +# endif return -1; } return 0; +#endif /* !AFS_RXERRQ_ENV */ } struct rx_ts_info_t * rx_ts_info_init(void) {