tCache last uid, gid to make translation faster. - plan9port - [fork] Plan 9 from user space
git clone git://src.adamsgaard.dk/plan9port
Log
Files
Refs
README
LICENSE
---
commit 6f6553dfb7ab5b286e3ac75348eb85dc8fda6666
parent 62c141582684ff2afdaa7c8698df9f596b2d3c84
Author: rsc 
Date:   Thu,  8 Apr 2004 19:31:21 +0000

Cache last uid, gid to make translation faster.

Diffstat:
  M src/lib9/_p9dir.c                   |      25 +++++++++++++++++++++----

1 file changed, 21 insertions(+), 4 deletions(-)
---
diff --git a/src/lib9/_p9dir.c b/src/lib9/_p9dir.c
t@@ -47,13 +47,20 @@ isdisk(struct stat *st)
 #define _HAVESTGEN
 #endif
 
+/*
+ * Caching the last group and passwd looked up is
+ * a significant win (stupidly enough) on most systems.
+ * It's not safe for threaded programs, but neither is using
+ * getpwnam in the first place, so I'm not too worried.
+ */
 int
 _p9dir(struct stat *st, char *name, Dir *d, char **str, char *estr)
 {
         char *s;
         char tmp[20];
-        struct group *g;
-        struct passwd *p;
+        static struct group *g;
+        static struct passwd *p;
+        static int gid, uid;
         int sz;
 
         sz = 0;
t@@ -82,7 +89,12 @@ _p9dir(struct stat *st, char *name, Dir *d, char **str, char *estr)
         sz += strlen(s)+1;
 
         /* user */
-        p = getpwuid(st->st_uid);
+        if(p && st->st_uid == uid && p->pw_uid == uid)
+                ;
+        else{
+                p = getpwuid(st->st_uid);
+                uid = st->st_uid;
+        }
         if(p == nil){
                 snprint(tmp, sizeof tmp, "%d", (int)st->st_uid);
                 s = tmp;
t@@ -100,7 +112,12 @@ _p9dir(struct stat *st, char *name, Dir *d, char **str, char *estr)
         }
 
         /* group */
-        g = getgrgid(st->st_gid);
+        if(g && st->st_gid == gid && g->gr_gid == gid)
+                ;
+        else{
+                g = getgrgid(st->st_gid);
+                gid = st->st_gid;
+        }
         if(g == nil){
                 snprint(tmp, sizeof tmp, "%d", (int)st->st_gid);
                 s = tmp;