From c4c12ae295ca6f3fb02e12d3bad8f92fee4dfe3f Mon Sep 17 00:00:00 2001 From: Miklos Szeredi Date: Thu, 20 Oct 2005 14:48:50 +0000 Subject: [PATCH] fix --- ChangeLog | 4 ++++ lib/fuse.c | 21 +++++++++++++++------ 2 files changed, 19 insertions(+), 6 deletions(-) diff --git a/ChangeLog b/ChangeLog index 947ef87..b0192d7 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,7 @@ +2005-10-18 Miklos Szeredi + + * lib: optimize buffer reallocation in fill_dir. + 2005-10-17 Miklos Szeredi * 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 @@ 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; -- 2.30.2