diff options
Diffstat (limited to 'firmware/common/dircache.c')
-rw-r--r-- | firmware/common/dircache.c | 23 |
1 files changed, 15 insertions, 8 deletions
diff --git a/firmware/common/dircache.c b/firmware/common/dircache.c index f47e65e428..334801ce57 100644 --- a/firmware/common/dircache.c +++ b/firmware/common/dircache.c | |||
@@ -38,7 +38,7 @@ | |||
38 | #include "kernel.h" | 38 | #include "kernel.h" |
39 | #include "usb.h" | 39 | #include "usb.h" |
40 | #include "file.h" | 40 | #include "file.h" |
41 | #include "buffer.h" | 41 | #include "core_alloc.h" |
42 | #include "dir.h" | 42 | #include "dir.h" |
43 | #include "storage.h" | 43 | #include "storage.h" |
44 | #if CONFIG_RTC | 44 | #if CONFIG_RTC |
@@ -57,6 +57,8 @@ | |||
57 | #else | 57 | #else |
58 | #define MAX_OPEN_DIRS 8 | 58 | #define MAX_OPEN_DIRS 8 |
59 | #endif | 59 | #endif |
60 | static DIR_CACHED opendirs[MAX_OPEN_DIRS]; | ||
61 | static char opendir_dnames[MAX_OPEN_DIRS][MAX_PATH]; | ||
60 | 62 | ||
61 | #define MAX_PENDING_BINDINGS 2 | 63 | #define MAX_PENDING_BINDINGS 2 |
62 | struct fdbind_queue { | 64 | struct fdbind_queue { |
@@ -571,7 +573,8 @@ int dircache_load(void) | |||
571 | } | 573 | } |
572 | 574 | ||
573 | allocated_size = maindata.size + DIRCACHE_RESERVE; | 575 | allocated_size = maindata.size + DIRCACHE_RESERVE; |
574 | dircache_root = buffer_alloc(allocated_size); | 576 | int handle = core_alloc("dircache", allocated_size); |
577 | dircache_root = core_get_data(handle); | ||
575 | /* needs to be struct-size aligned so that the pointer arithmetic below works */ | 578 | /* needs to be struct-size aligned so that the pointer arithmetic below works */ |
576 | ALIGN_BUFFER(dircache_root, allocated_size, sizeof(struct dircache_entry)); | 579 | ALIGN_BUFFER(dircache_root, allocated_size, sizeof(struct dircache_entry)); |
577 | entry_count = maindata.entry_count; | 580 | entry_count = maindata.entry_count; |
@@ -814,6 +817,7 @@ static void generate_dot_d_names(void) | |||
814 | strcpy(dot, "."); | 817 | strcpy(dot, "."); |
815 | strcpy(dotdot, ".."); | 818 | strcpy(dotdot, ".."); |
816 | } | 819 | } |
820 | |||
817 | /** | 821 | /** |
818 | * Start scanning the disk to build the dircache. | 822 | * Start scanning the disk to build the dircache. |
819 | * Either transparent or non-transparent build method is used. | 823 | * Either transparent or non-transparent build method is used. |
@@ -841,11 +845,13 @@ int dircache_build(int last_size) | |||
841 | queue_post(&dircache_queue, DIRCACHE_BUILD, 0); | 845 | queue_post(&dircache_queue, DIRCACHE_BUILD, 0); |
842 | return 2; | 846 | return 2; |
843 | } | 847 | } |
844 | 848 | ||
845 | if (last_size > DIRCACHE_RESERVE && last_size < DIRCACHE_LIMIT ) | 849 | if (last_size > DIRCACHE_RESERVE && last_size < DIRCACHE_LIMIT ) |
846 | { | 850 | { |
851 | int handle; | ||
847 | allocated_size = last_size + DIRCACHE_RESERVE; | 852 | allocated_size = last_size + DIRCACHE_RESERVE; |
848 | dircache_root = buffer_alloc(allocated_size); | 853 | handle = core_alloc("dircache", allocated_size); |
854 | dircache_root = core_get_data(handle); | ||
849 | ALIGN_BUFFER(dircache_root, allocated_size, sizeof(struct dircache_entry)); | 855 | ALIGN_BUFFER(dircache_root, allocated_size, sizeof(struct dircache_entry)); |
850 | d_names_start = d_names_end = ((char*)dircache_root)+allocated_size-1; | 856 | d_names_start = d_names_end = ((char*)dircache_root)+allocated_size-1; |
851 | dircache_size = 0; | 857 | dircache_size = 0; |
@@ -863,7 +869,8 @@ int dircache_build(int last_size) | |||
863 | * after generation the buffer will be compacted with DIRCACHE_RESERVE | 869 | * after generation the buffer will be compacted with DIRCACHE_RESERVE |
864 | * free bytes inbetween */ | 870 | * free bytes inbetween */ |
865 | size_t got_size; | 871 | size_t got_size; |
866 | char* buf = buffer_get_buffer(&got_size); | 872 | int handle = core_alloc_maximum("dircache", &got_size, NULL); |
873 | char* buf = core_get_data(handle); | ||
867 | dircache_root = (struct dircache_entry*)ALIGN_UP(buf, | 874 | dircache_root = (struct dircache_entry*)ALIGN_UP(buf, |
868 | sizeof(struct dircache_entry)); | 875 | sizeof(struct dircache_entry)); |
869 | d_names_start = d_names_end = buf + got_size - 1; | 876 | d_names_start = d_names_end = buf + got_size - 1; |
@@ -902,11 +909,11 @@ int dircache_build(int last_size) | |||
902 | allocated_size = (d_names_end - buf); | 909 | allocated_size = (d_names_end - buf); |
903 | reserve_used = 0; | 910 | reserve_used = 0; |
904 | 911 | ||
905 | buffer_release_buffer(allocated_size); | 912 | core_shrink(handle, dircache_root, allocated_size); |
906 | return res; | 913 | return res; |
907 | fail: | 914 | fail: |
908 | dircache_disable(); | 915 | dircache_disable(); |
909 | buffer_release_buffer(0); | 916 | core_free(handle); |
910 | return res; | 917 | return res; |
911 | } | 918 | } |
912 | 919 | ||
@@ -942,7 +949,7 @@ void dircache_init(void) | |||
942 | memset(opendirs, 0, sizeof(opendirs)); | 949 | memset(opendirs, 0, sizeof(opendirs)); |
943 | for (i = 0; i < MAX_OPEN_DIRS; i++) | 950 | for (i = 0; i < MAX_OPEN_DIRS; i++) |
944 | { | 951 | { |
945 | opendirs[i].theent.d_name = buffer_alloc(MAX_PATH); | 952 | opendirs[i].theent.d_name = opendir_dnames[i]; |
946 | } | 953 | } |
947 | 954 | ||
948 | queue_init(&dircache_queue, true); | 955 | queue_init(&dircache_queue, true); |