summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--apps/tree.c2
-rw-r--r--firmware/common/dircache.c25
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 --- */