mirror of
https://github.com/Rockbox/rockbox.git
synced 2025-10-14 02:27:39 -04:00
Boost open() performance on platforms with dircache. Tagcache initial
scanning now over 50% faster than before. git-svn-id: svn://svn.rockbox.org/rockbox/trunk@9306 a1c6a512-1295-4272-9138-f99709370657
This commit is contained in:
parent
6784e0333f
commit
2d93495df2
3 changed files with 52 additions and 9 deletions
|
@ -798,12 +798,20 @@ void dircache_bind(int fd, const char *path)
|
||||||
fd_bindings[fd] = entry;
|
fd_bindings[fd] = entry;
|
||||||
}
|
}
|
||||||
|
|
||||||
void dircache_update_filesize(int fd, long newsize)
|
void dircache_update_filesize(int fd, long newsize, long startcluster)
|
||||||
{
|
{
|
||||||
if (!dircache_initialized || fd < 0)
|
if (!dircache_initialized || fd < 0)
|
||||||
return ;
|
return ;
|
||||||
|
|
||||||
|
if (fd_bindings[fd] == NULL)
|
||||||
|
{
|
||||||
|
logf("dircache fd access error");
|
||||||
|
dircache_initialized = false;
|
||||||
|
return ;
|
||||||
|
}
|
||||||
|
|
||||||
fd_bindings[fd]->size = newsize;
|
fd_bindings[fd]->size = newsize;
|
||||||
|
fd_bindings[fd]->startcluster = startcluster;
|
||||||
}
|
}
|
||||||
|
|
||||||
void dircache_mkdir(const char *path)
|
void dircache_mkdir(const char *path)
|
||||||
|
@ -915,13 +923,19 @@ void dircache_rename(const char *oldpath, const char *newpath)
|
||||||
newentry->wrtdate = oldentry.wrtdate;
|
newentry->wrtdate = oldentry.wrtdate;
|
||||||
}
|
}
|
||||||
|
|
||||||
void dircache_add_file(const char *path)
|
void dircache_add_file(const char *path, long startcluster)
|
||||||
{
|
{
|
||||||
|
struct dircache_entry *entry;
|
||||||
|
|
||||||
if (!dircache_initialized)
|
if (!dircache_initialized)
|
||||||
return ;
|
return ;
|
||||||
|
|
||||||
logf("add file: %s", path);
|
logf("add file: %s", path);
|
||||||
dircache_new_entry(path, 0);
|
entry = dircache_new_entry(path, 0);
|
||||||
|
if (entry == NULL)
|
||||||
|
return ;
|
||||||
|
|
||||||
|
entry->startcluster = startcluster;
|
||||||
}
|
}
|
||||||
|
|
||||||
DIRCACHED* opendir_cached(const char* name)
|
DIRCACHED* opendir_cached(const char* name)
|
||||||
|
|
|
@ -99,6 +99,32 @@ int open(const char* pathname, int flags)
|
||||||
}
|
}
|
||||||
file->busy = true;
|
file->busy = true;
|
||||||
|
|
||||||
|
#ifdef HAVE_DIRCACHE
|
||||||
|
if (dircache_is_enabled() && !file->write)
|
||||||
|
{
|
||||||
|
const struct dircache_entry *ce;
|
||||||
|
|
||||||
|
ce = dircache_get_entry_ptr(pathname);
|
||||||
|
if (!ce)
|
||||||
|
{
|
||||||
|
errno = ENOENT;
|
||||||
|
file->busy = false;
|
||||||
|
return -7;
|
||||||
|
}
|
||||||
|
|
||||||
|
fat_open(IF_MV2(unsupported at the moment,)
|
||||||
|
ce->startcluster,
|
||||||
|
&(file->fatfile),
|
||||||
|
NULL);
|
||||||
|
file->size = ce->size;
|
||||||
|
file->attr = ce->attribute;
|
||||||
|
file->cacheoffset = -1;
|
||||||
|
file->fileoffset = 0;
|
||||||
|
|
||||||
|
return fd;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
strncpy(pathnamecopy,pathname,sizeof(pathnamecopy));
|
strncpy(pathnamecopy,pathname,sizeof(pathnamecopy));
|
||||||
pathnamecopy[sizeof(pathnamecopy)-1] = 0;
|
pathnamecopy[sizeof(pathnamecopy)-1] = 0;
|
||||||
|
|
||||||
|
@ -156,7 +182,7 @@ int open(const char* pathname, int flags)
|
||||||
return rc * 10 - 6;
|
return rc * 10 - 6;
|
||||||
}
|
}
|
||||||
#ifdef HAVE_DIRCACHE
|
#ifdef HAVE_DIRCACHE
|
||||||
dircache_add_file(pathname);
|
dircache_add_file(pathname, file->fatfile.firstcluster);
|
||||||
#endif
|
#endif
|
||||||
file->size = 0;
|
file->size = 0;
|
||||||
file->attr = 0;
|
file->attr = 0;
|
||||||
|
@ -394,6 +420,9 @@ int ftruncate(int fd, off_t size)
|
||||||
}
|
}
|
||||||
|
|
||||||
file->size = size;
|
file->size = size;
|
||||||
|
#ifdef HAVE_DIRCACHE
|
||||||
|
dircache_update_filesize(fd, size, file->fatfile.firstcluster);
|
||||||
|
#endif
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
@ -569,7 +598,7 @@ static int readwrite(int fd, void* buf, long count, bool write)
|
||||||
{
|
{
|
||||||
file->size = file->fileoffset;
|
file->size = file->fileoffset;
|
||||||
#ifdef HAVE_DIRCACHE
|
#ifdef HAVE_DIRCACHE
|
||||||
dircache_update_filesize(fd, file->size);
|
dircache_update_filesize(fd, file->size, file->fatfile.firstcluster);
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -82,12 +82,12 @@ const struct dircache_entry *dircache_get_entry_ptr(const char *filename);
|
||||||
void dircache_copy_path(const struct dircache_entry *entry, char *buf, int size);
|
void dircache_copy_path(const struct dircache_entry *entry, char *buf, int size);
|
||||||
|
|
||||||
void dircache_bind(int fd, const char *path);
|
void dircache_bind(int fd, const char *path);
|
||||||
void dircache_update_filesize(int fd, long newsize);
|
void dircache_update_filesize(int fd, long newsize, long startcluster);
|
||||||
void dircache_mkdir(const char *path);
|
void dircache_mkdir(const char *path);
|
||||||
void dircache_rmdir(const char *path);
|
void dircache_rmdir(const char *path);
|
||||||
void dircache_remove(const char *name);
|
void dircache_remove(const char *name);
|
||||||
void dircache_rename(const char *oldpath, const char *newpath);
|
void dircache_rename(const char *oldpath, const char *newpath);
|
||||||
void dircache_add_file(const char *path);
|
void dircache_add_file(const char *path, long startcluster);
|
||||||
|
|
||||||
DIRCACHED* opendir_cached(const char* name);
|
DIRCACHED* opendir_cached(const char* name);
|
||||||
struct dircache_entry* readdir_cached(DIRCACHED* dir);
|
struct dircache_entry* readdir_cached(DIRCACHED* dir);
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue