From 7b1e827f0cf6930a61671c1c26aab8ed662b4134 Mon Sep 17 00:00:00 2001 From: Miika Pekkarinen Date: Sat, 7 Apr 2007 17:48:51 +0000 Subject: [PATCH] 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 --- apps/main.c | 9 ++++++++- apps/tree.c | 3 ++- firmware/common/dircache.c | 11 ++++------- 3 files changed, 14 insertions(+), 9 deletions(-) diff --git a/apps/main.c b/apps/main.c index c5f2a99943..3145f3693b 100644 --- a/apps/main.c +++ b/apps/main.c @@ -172,7 +172,14 @@ static int init_dircache(bool preinit) } 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) diff --git a/apps/tree.c b/apps/tree.c index c3c5ce3239..5f5cb1137a 100644 --- a/apps/tree.c +++ b/apps/tree.c @@ -1348,7 +1348,8 @@ void tree_flush(void) { global_status.dircache_size = dircache_get_cache_size(); # ifdef HAVE_EEPROM_SETTINGS - dircache_save(); + if (firmware_settings.initialized) + dircache_save(); # endif dircache_disable(); } diff --git a/firmware/common/dircache.c b/firmware/common/dircache.c index 023f00f848..e69ecf3d5c 100644 --- a/firmware/common/dircache.c +++ b/firmware/common/dircache.c @@ -405,7 +405,7 @@ static struct dircache_entry* dircache_get_entry(const char *path, return cache_entry; } -#if 1 +#ifdef HAVE_EEPROM_SETTINGS /** * Function to load the internal cache structure from disk to initialize * the dircache really fast and little disk access. @@ -480,9 +480,6 @@ int dircache_save(void) remove(DIRCACHE_FILE); - while (thread_enabled) - sleep(1); - if (!dircache_initialized) return -1; @@ -718,7 +715,7 @@ bool dircache_is_enabled(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) { /* Block until dircache has been built. */ - while (!dircache_initialized && dircache_initializing) + while (!dircache_initialized && dircache_is_initializing()) sleep(1); if (!dircache_initialized) @@ -918,7 +915,7 @@ void dircache_bind(int fd, const char *path) struct dircache_entry *entry; /* Queue requests until dircache has been built. */ - if (!dircache_initialized && dircache_initializing) + if (!dircache_initialized && dircache_is_initializing()) { if (fdbind_idx >= MAX_PENDING_BINDINGS) return ;