Optimize _sock_findrock() for the empty case (XCC)
authorBarret Rhoden <brho@cs.berkeley.edu>
Wed, 2 Sep 2015 17:52:31 +0000 (13:52 -0400)
committerBarret Rhoden <brho@cs.berkeley.edu>
Mon, 28 Sep 2015 19:14:00 +0000 (15:14 -0400)
For programs that do not use the BSD socket shims, we still need check
if an FD is a socket or not in some places.  This requires an fstat to
identify the underlying device/file.  But if the list is empty (common
case for non-sockets programs), this syscall is a waste.

Note that _sock_newrock needs the fstat() done regardless, since it'll
use that info when making a new Rock.

Rebuild glibc if you want slightly better performance.

tools/compilers/gcc-glibc/glibc-2.19-akaros/sysdeps/akaros/plan9_sockets.c

index cbe12fe..90d6645 100644 (file)
@@ -138,9 +138,14 @@ Rock *_sock_findrock(int fd, struct stat * dp)
        Rock *r;
        struct stat d;
 
-       if (dp == 0)
+       /* Skip the fstat if there are no socket rocks */
+       if (!_sock_rock)
+               return 0;
+       /* If they pass us a struct stat, then they already did an fstat */
+       if (dp == 0) {
                dp = &d;
-       fstat(fd, dp);
+               fstat(fd, dp);
+       }
        for (r = _sock_rock; r; r = r->next) {
                if (r->inode == dp->st_ino && r->dev == dp->st_dev)
                        break;
@@ -153,6 +158,7 @@ Rock *_sock_newrock(int fd)
        Rock *r;
        struct stat d;
 
+       fstat(fd, &d);
        r = _sock_findrock(fd, &d);
        if (r == 0) {
                r = malloc(sizeof(Rock));