summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAmaury Pouly <pamaury@rockbox.org>2010-05-21 08:31:11 +0000
committerAmaury Pouly <pamaury@rockbox.org>2010-05-21 08:31:11 +0000
commit7c205aa686a013de6648fb6e203e1c1ca17f3dd1 (patch)
treeca88826cf418aea9b12cd98f2263924fc1698a08
parentdcbf4bbdeae394330b0e0f9bf27a9140dad48692 (diff)
downloadrockbox-7c205aa686a013de6648fb6e203e1c1ca17f3dd1.tar.gz
rockbox-7c205aa686a013de6648fb6e203e1c1ca17f3dd1.zip
FS#10913: fix file browser not updated on microsd insertion/removal. This is a synchro bug in dircache: the system send a SYS_FS_CHANGED message which is first handled by the main thread which rescan the directory but as dircache main treats the message after, the file browser get the old version... Workaround is to check message queue before opening a directory.
git-svn-id: svn://svn.rockbox.org/rockbox/trunk@26222 a1c6a512-1295-4272-9138-f99709370657
-rw-r--r--firmware/common/dircache.c15
1 files changed, 15 insertions, 0 deletions
diff --git a/firmware/common/dircache.c b/firmware/common/dircache.c
index e642296a35..a50ebe8f30 100644
--- a/firmware/common/dircache.c
+++ b/firmware/common/dircache.c
@@ -1211,6 +1211,19 @@ void dircache_add_file(const char *path, long startcluster)
1211 entry->startcluster = startcluster; 1211 entry->startcluster = startcluster;
1212} 1212}
1213 1213
1214/* Check if dircache state is still valid. With hotswap, on fs changed,
1215 * the dircache became invalid but functions coulld be called befire the
1216 * dircache thread process the message */
1217static void check_dircache_state(void)
1218{
1219 if(check_event_queue())
1220 {
1221 /* Keep this coherent with check_event_queue(). Currently, all the
1222 * messages that return true will lead to disable. */
1223 dircache_initialized = false;
1224 }
1225}
1226
1214DIR_CACHED* opendir_cached(const char* name) 1227DIR_CACHED* opendir_cached(const char* name)
1215{ 1228{
1216 int dd; 1229 int dd;
@@ -1235,6 +1248,8 @@ DIR_CACHED* opendir_cached(const char* name)
1235 } 1248 }
1236 1249
1237 pdir->busy = true; 1250 pdir->busy = true;
1251 /* check real dircache state */
1252 check_dircache_state();
1238 1253
1239 if (!dircache_initialized) 1254 if (!dircache_initialized)
1240 { 1255 {