fix
diff --git a/ChangeLog b/ChangeLog
index 947ef87..b0192d7 100644
--- 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
diff --git a/lib/fuse.c b/lib/fuse.c
index e44b9f2..b0cf553 100644
--- a/lib/fuse.c
+++ b/lib/fuse.c
@@ -103,6 +103,7 @@
char *contents;
int allocated;
unsigned len;
+ unsigned size;
unsigned needlen;
int filled;
unsigned long fh;
@@ -1261,7 +1262,6 @@
unsigned namelen = strlen(name);
unsigned entsize;
unsigned newlen;
- char *newptr;
if (statp)
stbuf = *statp;
@@ -1291,12 +1291,21 @@
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;