From 2bc133dce9271874433cbbaeb74667be4a7d5710 Mon Sep 17 00:00:00 2001 From: Miika Pekkarinen Date: Tue, 21 Jun 2011 17:42:31 +0000 Subject: [PATCH] Try to handle dircache rebuild event properly. Playlist should now cache new pointers to dircache items when dircache goes offline and comes back onlineagain (during tagcache commit). This should prevent wrong filenames to appear in playlist. git-svn-id: svn://svn.rockbox.org/rockbox/trunk@30047 a1c6a512-1295-4272-9138-f99709370657 --- apps/playlist.c | 33 +++++++++++++++++++++++++-------- firmware/include/dircache.h | 1 + 2 files changed, 26 insertions(+), 8 deletions(-) diff --git a/apps/playlist.c b/apps/playlist.c index ea183d7552..fc6b20307b 100644 --- a/apps/playlist.c +++ b/apps/playlist.c @@ -1244,7 +1244,12 @@ static void playlist_flush_callback(void *param) sync_control(playlist, true); } } - + +static bool is_dircache_pointers_intact(void) +{ + return dircache_get_appflag(DIRCACHE_APPFLAG_PLAYLIST) ? true : false; +} + static void playlist_thread(void) { struct queue_event ev; @@ -1277,6 +1282,7 @@ static void playlist_thread(void) /* Start the background scanning after either the disk spindown timeout or 5s, whichever is less */ case SYS_TIMEOUT: + { playlist = ¤t_playlist; if (playlist->control_fd >= 0) { @@ -1284,11 +1290,14 @@ static void playlist_thread(void) register_storage_idle_func(playlist_flush_callback); } - if (!dirty_pointers) - break ; - if (!dircache_is_enabled() || !playlist->filenames || playlist->amount <= 0) + { + break ; + } + + /* Check if previously loaded pointers are intact. */ + if (is_dircache_pointers_intact() && !dirty_pointers) break ; #ifdef HAVE_ADJUSTABLE_CPU_FREQ @@ -1298,7 +1307,7 @@ static void playlist_thread(void) && queue_empty(&playlist_queue); index++) { /* Process only pointers that are not already loaded. */ - if (playlist->filenames[index] >= 0) + if (is_dircache_pointers_intact() && playlist->filenames[index] >= 0) continue ; control_file = playlist->indices[index] & PLAYLIST_INSERT_TYPE_MASK; @@ -1307,7 +1316,9 @@ static void playlist_thread(void) /* Load the filename from playlist file. */ if (get_filename(playlist, index, seek, control_file, tmp, sizeof(tmp)) < 0) + { break ; + } /* Set the dircache entry pointer. */ playlist->filenames[index] = dircache_get_entry_id(tmp); @@ -1315,12 +1326,18 @@ static void playlist_thread(void) /* And be on background so user doesn't notice any delays. */ yield(); } - + + if (dircache_is_enabled()) + dircache_set_appflag(DIRCACHE_APPFLAG_PLAYLIST); + #ifdef HAVE_ADJUSTABLE_CPU_FREQ cpu_boost(false); #endif - dirty_pointers = false; + if (index == playlist->amount) + dirty_pointers = false; + break ; + } #if (CONFIG_PLATFORM & PLATFORM_NATIVE) case SYS_USB_CONNECTED: @@ -1349,7 +1366,7 @@ static int get_filename(struct playlist_info* playlist, int index, int seek, buf_length = MAX_PATH+1; #ifdef HAVE_DIRCACHE - if (dircache_is_enabled() && playlist->filenames) + if (is_dircache_pointers_intact() && playlist->filenames) { if (playlist->filenames[index] >= 0) { diff --git a/firmware/include/dircache.h b/firmware/include/dircache.h index 585bb10fbc..0ac937df84 100644 --- a/firmware/include/dircache.h +++ b/firmware/include/dircache.h @@ -30,6 +30,7 @@ #define DIRCACHE_LIMIT (1024*1024*6) #define DIRCACHE_APPFLAG_TAGCACHE 0x0001 +#define DIRCACHE_APPFLAG_PLAYLIST 0x0002 /* Internal structures. */ struct travel_data {