1
0
Fork 0
forked from len0rd/rockbox

Dircache fixes: Stop scanning properly if shutdown is initiated. Require user to re-enable dircache if initialization fails. Don't create statefile unless eeprom settings have been initialized.

git-svn-id: svn://svn.rockbox.org/rockbox/trunk@13060 a1c6a512-1295-4272-9138-f99709370657
This commit is contained in:
Miika Pekkarinen 2007-04-07 17:48:51 +00:00
parent 8e6e25c353
commit 7b1e827f0c
3 changed files with 14 additions and 9 deletions

View file

@ -172,7 +172,14 @@ static int init_dircache(bool preinit)
} }
if (result < 0) if (result < 0)
gui_syncsplash(0, "Failed! Result: %d", result); {
/* Initialization of dircache failed. Manual action is
* necessary to enable dircache again.
*/
gui_syncsplash(0, "Dircache failed, disabled. Result: %d", result);
global_settings.dircache = false;
}
} }
if (clear) if (clear)

View file

@ -1348,7 +1348,8 @@ void tree_flush(void)
{ {
global_status.dircache_size = dircache_get_cache_size(); global_status.dircache_size = dircache_get_cache_size();
# ifdef HAVE_EEPROM_SETTINGS # ifdef HAVE_EEPROM_SETTINGS
dircache_save(); if (firmware_settings.initialized)
dircache_save();
# endif # endif
dircache_disable(); dircache_disable();
} }

View file

@ -405,7 +405,7 @@ static struct dircache_entry* dircache_get_entry(const char *path,
return cache_entry; return cache_entry;
} }
#if 1 #ifdef HAVE_EEPROM_SETTINGS
/** /**
* Function to load the internal cache structure from disk to initialize * Function to load the internal cache structure from disk to initialize
* the dircache really fast and little disk access. * the dircache really fast and little disk access.
@ -480,9 +480,6 @@ int dircache_save(void)
remove(DIRCACHE_FILE); remove(DIRCACHE_FILE);
while (thread_enabled)
sleep(1);
if (!dircache_initialized) if (!dircache_initialized)
return -1; return -1;
@ -718,7 +715,7 @@ bool dircache_is_enabled(void)
*/ */
bool dircache_is_initializing(void) bool dircache_is_initializing(void)
{ {
return dircache_initializing; return dircache_initializing || thread_enabled;
} }
/** /**
@ -835,7 +832,7 @@ void dircache_copy_path(const struct dircache_entry *entry, char *buf, int size)
static int block_until_ready(void) static int block_until_ready(void)
{ {
/* Block until dircache has been built. */ /* Block until dircache has been built. */
while (!dircache_initialized && dircache_initializing) while (!dircache_initialized && dircache_is_initializing())
sleep(1); sleep(1);
if (!dircache_initialized) if (!dircache_initialized)
@ -918,7 +915,7 @@ void dircache_bind(int fd, const char *path)
struct dircache_entry *entry; struct dircache_entry *entry;
/* Queue requests until dircache has been built. */ /* Queue requests until dircache has been built. */
if (!dircache_initialized && dircache_initializing) if (!dircache_initialized && dircache_is_initializing())
{ {
if (fdbind_idx >= MAX_PENDING_BINDINGS) if (fdbind_idx >= MAX_PENDING_BINDINGS)
return ; return ;