Some time ago I posted about a question about some cleanup of what I
thought looked like some strange code in the kernel - specifically about
the sock_rcvlowat() function in linux/include/net/sock.h
static inline int sock_rcvlowat(struct sock *sk, int waitall, int len)
{
return (waitall ? len : min(sk->rcvlowat, len)) ? : 1;
}
The empty second expression puzzled me. Mark Hahn (amongst many other
people) pointed out to me that it was a valid gcc extention (thank you),
but I still found it hard to read and exchanged several emails with Mark
about how to improve the function. Mark came up with a much more
readable version that achieves the exact same result and generates just
as good (if not better) code than the original one-line function - the
function below:
static inline int sock_rcvlowat(struct sock *sk, int waitall, int len)
{
int r = len;
if (!waitall)
r = min(sk->rcvlowat, len);
return max(1,r);
}
I have included a patch below (against 2.4.5pre1) that makes the change
to the more readable version and would like people on the list to
consider it as a replacement.
Credit for the code should go 100% to Mark as he wrote it, I'm just
submitting it to the list since I found it so nice :-)
--- linux-2.4.5pre1/include/net/sock.h Tue May 8 00:12:14 2001
+++ linux/include/net/sock.h Tue May 8 00:46:43 2001
@@ -1265,7 +1265,10 @@
static inline int sock_rcvlowat(struct sock *sk, int waitall, int len)
{
- return (waitall ? len : min(sk->rcvlowat, len)) ? : 1;
+ int r = len;
+ if (!waitall)
+ r = min(sk->rcvlowat, len);
+ return max(1,r);
}
/* Alas, with timeout socket operations are not restartable.
Best regards,
Jesper Juhl - juhl@eisenstein.dk
- struggeling to understand this magnificent kernel beast ;) -
-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/