diff options
author | Amaury Pouly <pamaury@rockbox.org> | 2010-05-21 08:31:11 +0000 |
---|---|---|
committer | Amaury Pouly <pamaury@rockbox.org> | 2010-05-21 08:31:11 +0000 |
commit | 7c205aa686a013de6648fb6e203e1c1ca17f3dd1 (patch) | |
tree | ca88826cf418aea9b12cd98f2263924fc1698a08 /firmware/common | |
parent | dcbf4bbdeae394330b0e0f9bf27a9140dad48692 (diff) | |
download | rockbox-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
Diffstat (limited to 'firmware/common')
-rw-r--r-- | firmware/common/dircache.c | 15 |
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 */ | ||
1217 | static 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 | |||
1214 | DIR_CACHED* opendir_cached(const char* name) | 1227 | DIR_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 | { |