forked from len0rd/rockbox
Implemented directory caching. No more waiting for disk to spin up while
browsing when cache is enabled (system -> disk -> enable directory cache). Cache building on boot is transparent except the first boot. git-svn-id: svn://svn.rockbox.org/rockbox/trunk@7588 a1c6a512-1295-4272-9138-f99709370657
This commit is contained in:
parent
86e31d5558
commit
ab78b04680
15 changed files with 1068 additions and 21 deletions
96
firmware/include/dircache.h
Normal file
96
firmware/include/dircache.h
Normal file
|
|
@ -0,0 +1,96 @@
|
|||
/***************************************************************************
|
||||
* __________ __ ___.
|
||||
* Open \______ \ ____ ____ | | _\_ |__ _______ ___
|
||||
* Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ /
|
||||
* Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < <
|
||||
* Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \
|
||||
* \/ \/ \/ \/ \/
|
||||
* $Id$
|
||||
*
|
||||
* Copyright (C) 2005 by Miika Pekkarinen
|
||||
*
|
||||
* All files in this archive are subject to the GNU General Public License.
|
||||
* See the file COPYING in the source tree root for full license agreement.
|
||||
*
|
||||
* This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
|
||||
* KIND, either express or implied.
|
||||
*
|
||||
****************************************************************************/
|
||||
#ifndef _DIRCACHE_H
|
||||
#define _DIRCACHE_H
|
||||
|
||||
#include "dir.h"
|
||||
|
||||
#ifdef HAVE_DIRCACHE
|
||||
|
||||
#define DIRCACHE_RESERVE (1024*64)
|
||||
#define DIRCACHE_LIMIT (1024*1024*2)
|
||||
#define DIRCACHE_FILE ROCKBOX_DIR "/dircache.dat"
|
||||
|
||||
/* Internal structures. */
|
||||
struct travel_data {
|
||||
struct dircache_entry *ce;
|
||||
struct dircache_entry *down_entry;
|
||||
struct fat_dir *dir;
|
||||
struct fat_dir newdir;
|
||||
struct fat_direntry entry;
|
||||
int pathpos;
|
||||
};
|
||||
|
||||
#define DIRCACHE_MAGIC 0x00d0c0a0
|
||||
struct dircache_maindata {
|
||||
long magic;
|
||||
long size;
|
||||
struct dircache_entry *root_entry;
|
||||
};
|
||||
|
||||
/* Exported structures. */
|
||||
struct dircache_entry {
|
||||
struct dircache_entry *next;
|
||||
struct dircache_entry *down;
|
||||
int attribute;
|
||||
long size;
|
||||
long startcluster;
|
||||
unsigned short wrtdate;
|
||||
unsigned short wrttime;
|
||||
unsigned char name_len;
|
||||
char *d_name;
|
||||
};
|
||||
|
||||
typedef struct {
|
||||
bool busy;
|
||||
struct dircache_entry *entry;
|
||||
struct dircache_entry secondary_entry;
|
||||
DIR *regulardir;
|
||||
} DIRCACHED;
|
||||
|
||||
void dircache_init(void);
|
||||
int dircache_load(const char *path);
|
||||
int dircache_save(const char *path);
|
||||
int dircache_build(int last_size);
|
||||
bool dircache_is_enabled(void);
|
||||
int dircache_get_cache_size(void);
|
||||
void dircache_disable(void);
|
||||
|
||||
void dircache_bind(int fd, const char *path);
|
||||
void dircache_update_filesize(int fd, long newsize);
|
||||
void dircache_mkdir(const char *path);
|
||||
void dircache_rmdir(const char *path);
|
||||
void dircache_remove(const char *name);
|
||||
void dircache_rename(const char *oldpath, const char *newpath);
|
||||
void dircache_add_file(const char *path);
|
||||
|
||||
DIRCACHED* opendir_cached(const char* name);
|
||||
struct dircache_entry* readdir_cached(DIRCACHED* dir);
|
||||
int closedir_cached(DIRCACHED *dir);
|
||||
|
||||
#else /* HAVE_DIRCACHE */
|
||||
# define DIRCACHED DIR
|
||||
# define dircache_entry dirent
|
||||
# define opendir_cached opendir
|
||||
# define closedir_cached closedir
|
||||
# define readdir_cached readdir
|
||||
# define closedir_cached closedir
|
||||
#endif /* !HAVE_DIRCACHE */
|
||||
|
||||
#endif
|
||||
Loading…
Add table
Add a link
Reference in a new issue