From 4b2aa9830ef0bb79d1089f35a974cd7cfb592422 Mon Sep 17 00:00:00 2001 From: Miika Pekkarinen Date: Thu, 20 Oct 2005 08:33:59 +0000 Subject: Now correctly interrupting the dircache rebuilding. git-svn-id: svn://svn.rockbox.org/rockbox/trunk@7645 a1c6a512-1295-4272-9138-f99709370657 --- apps/tree.c | 2 +- firmware/common/dircache.c | 25 +++++++++++++++++++++++-- 2 files changed, 24 insertions(+), 3 deletions(-) diff --git a/apps/tree.c b/apps/tree.c index df2bd24..8d68814 100644 --- a/apps/tree.c +++ b/apps/tree.c @@ -1641,8 +1641,8 @@ void tree_flush(void) if (dircache_is_enabled()) { global_settings.dircache_size = dircache_get_cache_size(); - dircache_disable(); } + dircache_disable(); } else { diff --git a/firmware/common/dircache.c b/firmware/common/dircache.c index ca07a35..fa24321 100644 --- a/firmware/common/dircache.c +++ b/firmware/common/dircache.c @@ -41,6 +41,7 @@ /* Queue commands. */ #define DIRCACHE_BUILD 1 +#define DIRCACHE_STOP 2 extern char *audiobuf; @@ -406,6 +407,11 @@ static void dircache_thread(void) thread_enabled = false; break ; + case DIRCACHE_STOP: + logf("Stopped the rebuilding."); + dircache_initialized = false; + break ; + #ifndef SIMULATOR case SYS_USB_CONNECTED: usb_acknowledge(SYS_USB_CONNECTED_ACK); @@ -487,13 +493,28 @@ int dircache_get_cache_size(void) void dircache_disable(void) { int i; + bool cache_in_use; + + if (thread_enabled) + queue_post(&dircache_queue, DIRCACHE_STOP, 0); while (thread_enabled) sleep(1); dircache_initialized = false; - for (i = 0; i < MAX_OPEN_DIRS; i++) - opendirs[i].busy = false; + logf("Waiting for cached dirs to release"); + do { + cache_in_use = false; + for (i = 0; i < MAX_OPEN_DIRS; i++) { + if (!opendirs[i].regulardir && opendirs[i].busy) + { + cache_in_use = true; + sleep(1); + break ; + } + } + } while (cache_in_use) ; + logf("Cache released"); } /* --- Directory cache live updating functions --- */ -- cgit v1.1