fix
authorMiklos Szeredi <miklos@szeredi.hu>
Thu, 20 Oct 2005 14:48:50 +0000 (14:48 +0000)
committerMiklos Szeredi <miklos@szeredi.hu>
Thu, 20 Oct 2005 14:48:50 +0000 (14:48 +0000)
ChangeLog
lib/fuse.c

index 947ef87d62085701e9683a64e4da4ca83f58f535..b0192d776cd2dfa5c252e9d635f641a12376183d 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,7 @@
+2005-10-18  Miklos Szeredi <miklos@szeredi.hu>
+
+       * lib: optimize buffer reallocation in fill_dir.
+
 2005-10-17  Miklos Szeredi <miklos@szeredi.hu>
 
        * Released 2.4.1
index e44b9f2859926af2bd7240367660c26c0988c3c0..b0cf5530ad360c8ee3f69f0b6befaf3c8156bad4 100644 (file)
@@ -103,6 +103,7 @@ struct fuse_dirhandle {
     char *contents;
     int allocated;
     unsigned len;
+    unsigned size;
     unsigned needlen;
     int filled;
     unsigned long fh;
@@ -1261,7 +1262,6 @@ static int fill_dir_common(struct fuse_dirhandle *dh, const char *name,
     unsigned namelen = strlen(name);
     unsigned entsize;
     unsigned newlen;
-    char *newptr;
 
     if (statp)
         stbuf = *statp;
@@ -1291,12 +1291,21 @@ static int fill_dir_common(struct fuse_dirhandle *dh, const char *name,
             return 1;
     }
 
-    newptr = (char *) realloc(dh->contents, newlen);
-    if (!newptr) {
-        dh->error = -ENOMEM;
-        return 1;
+    if (newlen > dh->size) {
+        char *newptr;
+
+        if (!dh->size)
+            dh->size = 1024;
+        while (newlen > dh->size)
+            dh->size *= 2;
+
+        newptr = (char *) realloc(dh->contents, dh->size);
+        if (!newptr) {
+            dh->error = -ENOMEM;
+            return 1;
+        }
+        dh->contents = newptr;
     }
-    dh->contents = newptr;
     fuse_add_dirent(dh->contents + dh->len, name, &stbuf, off ? off : newlen);
     dh->len = newlen;
     return 0;