Index: apps/main.c =================================================================== --- apps/main.c (revision 18881) +++ apps/main.c (working copy) @@ -143,12 +143,12 @@ int result = 0; bool clear = false; + if (preinit) - dircache_init(); + dircache_init(global_settings.dircache); if (!global_settings.dircache) return 0; - # ifdef HAVE_EEPROM_SETTINGS if (firmware_settings.initialized && firmware_settings.disk_clean && preinit) Index: firmware/include/dircache.h =================================================================== --- firmware/include/dircache.h (revision 18881) +++ firmware/include/dircache.h (working copy) @@ -85,7 +85,7 @@ DIR_UNCACHED *regulardir; } DIR_CACHED; -void dircache_init(void); +void dircache_init(bool); int dircache_load(void); int dircache_save(void); int dircache_build(int last_size); Index: firmware/common/dircache.c =================================================================== --- firmware/common/dircache.c (revision 18881) +++ firmware/common/dircache.c (working copy) @@ -55,6 +55,9 @@ #define MAX_OPEN_DIRS 8 #endif static DIR_CACHED opendirs[MAX_OPEN_DIRS]; +/* this is used instead of buffer_alloc() for the + opendirs[i].secondary_entry.d_name */ +static char entrybuf[MAX_OPEN_DIRS][MAX_PATH]; static struct dircache_entry *fd_bindings[MAX_OPEN_FILES]; static struct dircache_entry *dircache_root; @@ -74,7 +77,8 @@ static char dircache_cur_path[MAX_PATH*2]; static struct event_queue dircache_queue; -static long dircache_stack[(DEFAULT_STACK_SIZE + 0x900)/sizeof(long)]; +#define DIRCACHE_STACK_SIZE (DEFAULT_STACK_SIZE + 0x900)/sizeof(long) +static long *dircache_stack; static const char dircache_thread_name[] = "dircache"; static struct fdbind_queue fdbind_cache[MAX_PENDING_BINDINGS]; @@ -744,7 +748,7 @@ * Main initialization function that must be called before any other * operations within the dircache. */ -void dircache_init(void) +void dircache_init(bool start) { int i; @@ -752,12 +756,15 @@ dircache_initializing = false; memset(opendirs, 0, sizeof(opendirs)); + for (i = 0; i < MAX_OPEN_DIRS; i++) { - opendirs[i].secondary_entry.d_name = buffer_alloc(MAX_PATH); + opendirs[i].secondary_entry.d_name = &entrybuf[i]; } - + if (!start) + return; queue_init(&dircache_queue, true); + dircache_stack = (long*)buffer_alloc(DIRCACHE_STACK_SIZE); create_thread(dircache_thread, dircache_stack, sizeof(dircache_stack), 0, dircache_thread_name IF_PRIO(, PRIORITY_BACKGROUND)