diff options
author | Michael Sevakis <jethead71@rockbox.org> | 2017-01-17 14:45:07 -0500 |
---|---|---|
committer | Michael Sevakis <jethead71@rockbox.org> | 2017-01-17 15:27:47 -0500 |
commit | 16a9f84571276a13f4cfd5c66db8cd63ce4e2e7f (patch) | |
tree | c1a746cbf9ef8b7780b8ffd06783c75a97941373 /apps/tagcache.c | |
parent | a931c76b3a46d1884e985a3bfc82b947521dab97 (diff) | |
download | rockbox-16a9f84571276a13f4cfd5c66db8cd63ce4e2e7f.tar.gz rockbox-16a9f84571276a13f4cfd5c66db8cd63ce4e2e7f.zip |
Reenable database ramcache and playlist dircache
Playlist dircache references should be back in working order.
Reenabling dircache references in the database ramcache is not
yet done as it requires quite a bit of rework. Otherwise, the
database in RAM is functional again.
Some buffer compatibility changes have been made for database
commit because the dircache buffer can no longer be stolen, only
freed by an API call.
Change-Id: Ib57c3e98cb23e798d4439e9da7ebd73826e733a4
Diffstat (limited to 'apps/tagcache.c')
-rw-r--r-- | apps/tagcache.c | 150 |
1 files changed, 78 insertions, 72 deletions
diff --git a/apps/tagcache.c b/apps/tagcache.c index 2b6041227b..df252ca0bc 100644 --- a/apps/tagcache.c +++ b/apps/tagcache.c | |||
@@ -90,6 +90,10 @@ | |||
90 | 90 | ||
91 | #undef HAVE_DIRCACHE | 91 | #undef HAVE_DIRCACHE |
92 | 92 | ||
93 | #ifdef HAVE_DIRCACHE | ||
94 | #include "dircache.h" | ||
95 | #endif | ||
96 | |||
93 | #ifdef __PCTOOL__ | 97 | #ifdef __PCTOOL__ |
94 | #define yield() do { } while(0) | 98 | #define yield() do { } while(0) |
95 | #define sim_sleep(timeout) do { } while(0) | 99 | #define sim_sleep(timeout) do { } while(0) |
@@ -112,6 +116,9 @@ static long tempbufidx; /* Current location in buffer. */ | |||
112 | static size_t tempbuf_size; /* Buffer size (TEMPBUF_SIZE). */ | 116 | static size_t tempbuf_size; /* Buffer size (TEMPBUF_SIZE). */ |
113 | static long tempbuf_left; /* Buffer space left. */ | 117 | static long tempbuf_left; /* Buffer space left. */ |
114 | static long tempbuf_pos; | 118 | static long tempbuf_pos; |
119 | #ifndef __PCTOOL__ | ||
120 | static int tempbuf_handle; | ||
121 | #endif | ||
115 | 122 | ||
116 | #define SORTED_TAGS_COUNT 8 | 123 | #define SORTED_TAGS_COUNT 8 |
117 | #define TAGCACHE_IS_UNIQUE(tag) (BIT_N(tag) & TAGCACHE_UNIQUE_TAGS) | 124 | #define TAGCACHE_IS_UNIQUE(tag) (BIT_N(tag) & TAGCACHE_UNIQUE_TAGS) |
@@ -289,17 +296,6 @@ static ssize_t ecwrite_index_entry(int fd, struct index_entry *buf) | |||
289 | return ecwrite(fd, buf, 1, index_entry_ec, tc_stat.econ); | 296 | return ecwrite(fd, buf, 1, index_entry_ec, tc_stat.econ); |
290 | } | 297 | } |
291 | 298 | ||
292 | #ifdef HAVE_DIRCACHE | ||
293 | /** | ||
294 | * Returns true if specified flag is still present, i.e., dircache | ||
295 | * has not been reloaded. | ||
296 | */ | ||
297 | static bool is_dircache_intact(void) | ||
298 | { | ||
299 | return dircache_get_appflag(DIRCACHE_APPFLAG_TAGCACHE); | ||
300 | } | ||
301 | #endif | ||
302 | |||
303 | static int open_tag_fd(struct tagcache_header *hdr, int tag, bool write) | 299 | static int open_tag_fd(struct tagcache_header *hdr, int tag, bool write) |
304 | { | 300 | { |
305 | int fd; | 301 | int fd; |
@@ -434,7 +430,7 @@ static long find_entry_ram(const char *filename, int dc) | |||
434 | 430 | ||
435 | return -1; | 431 | return -1; |
436 | } | 432 | } |
437 | #endif | 433 | #endif /* defined (HAVE_TC_RAMCACHE) && defined (HAVE_DIRCACHE) */ |
438 | 434 | ||
439 | static long find_entry_disk(const char *filename_raw, bool localfd) | 435 | static long find_entry_disk(const char *filename_raw, bool localfd) |
440 | { | 436 | { |
@@ -590,7 +586,7 @@ static bool get_index(int masterfd, int idxid, | |||
590 | if (ramcache_hdr->indices[idxid].flag & FLAG_DELETED) | 586 | if (ramcache_hdr->indices[idxid].flag & FLAG_DELETED) |
591 | return false; | 587 | return false; |
592 | 588 | ||
593 | # ifdef HAVE_DIRCACHE | 589 | #ifdef HAVE_DIRCACHE |
594 | if (!(ramcache_hdr->indices[idxid].flag & FLAG_DIRCACHE) | 590 | if (!(ramcache_hdr->indices[idxid].flag & FLAG_DIRCACHE) |
595 | || is_dircache_intact()) | 591 | || is_dircache_intact()) |
596 | #endif | 592 | #endif |
@@ -599,8 +595,6 @@ static bool get_index(int masterfd, int idxid, | |||
599 | return true; | 595 | return true; |
600 | } | 596 | } |
601 | } | 597 | } |
602 | #else | ||
603 | (void)use_ram; | ||
604 | #endif | 598 | #endif |
605 | 599 | ||
606 | if (masterfd < 0) | 600 | if (masterfd < 0) |
@@ -632,6 +626,8 @@ static bool get_index(int masterfd, int idxid, | |||
632 | return false; | 626 | return false; |
633 | 627 | ||
634 | return true; | 628 | return true; |
629 | |||
630 | (void)use_ram; | ||
635 | } | 631 | } |
636 | 632 | ||
637 | #ifndef __PCTOOL__ | 633 | #ifndef __PCTOOL__ |
@@ -724,7 +720,7 @@ static bool retrieve(struct tagcache_search *tcs, struct index_entry *idx, | |||
724 | { | 720 | { |
725 | struct tagfile_entry *ep; | 721 | struct tagfile_entry *ep; |
726 | 722 | ||
727 | # ifdef HAVE_DIRCACHE | 723 | #ifdef HAVE_DIRCACHE |
728 | if (tag == tag_filename && (idx->flag & FLAG_DIRCACHE)) | 724 | if (tag == tag_filename && (idx->flag & FLAG_DIRCACHE)) |
729 | { | 725 | { |
730 | /* for tag_filename, seek is a dircache index */ | 726 | /* for tag_filename, seek is a dircache index */ |
@@ -745,7 +741,7 @@ static bool retrieve(struct tagcache_search *tcs, struct index_entry *idx, | |||
745 | } | 741 | } |
746 | } | 742 | } |
747 | else | 743 | else |
748 | # endif | 744 | #endif /* HAVE_DIRCACHE */ |
749 | if (tag != tag_filename) | 745 | if (tag != tag_filename) |
750 | { | 746 | { |
751 | ep = (struct tagfile_entry *)&ramcache_hdr->tags[tag][seek]; | 747 | ep = (struct tagfile_entry *)&ramcache_hdr->tags[tag][seek]; |
@@ -1511,8 +1507,7 @@ static bool get_next(struct tagcache_search *tcs) | |||
1511 | #ifdef HAVE_TC_RAMCACHE | 1507 | #ifdef HAVE_TC_RAMCACHE |
1512 | if (tcs->ramsearch) | 1508 | if (tcs->ramsearch) |
1513 | { | 1509 | { |
1514 | 1510 | #ifdef HAVE_DIRCACHE | |
1515 | #if defined(HAVE_TC_RAMCACHE) && defined(HAVE_DIRCACHE) | ||
1516 | if (tcs->type == tag_filename && (flag & FLAG_DIRCACHE)) | 1511 | if (tcs->type == tag_filename && (flag & FLAG_DIRCACHE)) |
1517 | { | 1512 | { |
1518 | if (is_dircache_intact()) | 1513 | if (is_dircache_intact()) |
@@ -1537,7 +1532,7 @@ static bool get_next(struct tagcache_search *tcs) | |||
1537 | } | 1532 | } |
1538 | } | 1533 | } |
1539 | else | 1534 | else |
1540 | #endif | 1535 | #endif /* HAVE_DIRCACHE */ |
1541 | if (tcs->type != tag_filename) | 1536 | if (tcs->type != tag_filename) |
1542 | { | 1537 | { |
1543 | struct tagfile_entry *ep; | 1538 | struct tagfile_entry *ep; |
@@ -1766,6 +1761,13 @@ bool tagcache_fill_tags(struct mp3entry *id3, const char *filename) | |||
1766 | 1761 | ||
1767 | return true; | 1762 | return true; |
1768 | } | 1763 | } |
1764 | #elif defined (HAVE_TC_RAMCACHE) | ||
1765 | /* temporary dummy function until integration is sorted out --jethead71 */ | ||
1766 | bool tagcache_fill_tags(struct mp3entry *id3, const char *filename) | ||
1767 | { | ||
1768 | return false; | ||
1769 | (void)id3; (void)filename; | ||
1770 | } | ||
1769 | #endif | 1771 | #endif |
1770 | 1772 | ||
1771 | static inline void write_item(const char *item) | 1773 | static inline void write_item(const char *item) |
@@ -2982,27 +2984,25 @@ static bool commit(void) | |||
2982 | #ifdef HAVE_TC_RAMCACHE | 2984 | #ifdef HAVE_TC_RAMCACHE |
2983 | tc_stat.ramcache = false; | 2985 | tc_stat.ramcache = false; |
2984 | #endif | 2986 | #endif |
2985 | 2987 | ||
2988 | /* Beyond here, jump to commit_error to undo locks and restore dircache */ | ||
2989 | rc = false; | ||
2986 | read_lock++; | 2990 | read_lock++; |
2987 | 2991 | ||
2988 | /* Try to steal every buffer we can :) */ | 2992 | /* Try to steal every buffer we can :) */ |
2989 | if (tempbuf_size == 0) | 2993 | if (tempbuf_size == 0) |
2990 | local_allocation = true; | 2994 | local_allocation = true; |
2991 | 2995 | ||
2992 | #if 0 /* FIXME: How much big? dircache buffer can no longer be taken but | ||
2993 | may be freed to make room and the cache resumed. --jethead71 */ | ||
2994 | #ifdef HAVE_DIRCACHE | 2996 | #ifdef HAVE_DIRCACHE |
2995 | if (tempbuf_size == 0) | 2997 | if (tempbuf_size == 0) |
2996 | { | 2998 | { |
2997 | /* Shut down dircache to free its allocation. */ | 2999 | /* Suspend dircache to free its allocation. */ |
2998 | dircache_free_buffer(); | 3000 | dircache_free_buffer(); |
2999 | if (tempbuf_size > 0) | 3001 | dircache_buffer_stolen = true; |
3000 | { | 3002 | |
3001 | dircache_buffer_stolen = true; | 3003 | allocate_tempbuf(); |
3002 | } | ||
3003 | } | 3004 | } |
3004 | #endif | 3005 | #endif /* HAVE_DIRCACHE */ |
3005 | #endif | ||
3006 | 3006 | ||
3007 | #ifdef HAVE_TC_RAMCACHE | 3007 | #ifdef HAVE_TC_RAMCACHE |
3008 | if (tempbuf_size == 0 && tc_stat.ramcache_allocated > 0) | 3008 | if (tempbuf_size == 0 && tc_stat.ramcache_allocated > 0) |
@@ -3021,8 +3021,7 @@ static bool commit(void) | |||
3021 | logf("delaying commit until next boot"); | 3021 | logf("delaying commit until next boot"); |
3022 | tc_stat.commit_delayed = true; | 3022 | tc_stat.commit_delayed = true; |
3023 | close(tmpfd); | 3023 | close(tmpfd); |
3024 | read_lock--; | 3024 | goto commit_error; |
3025 | return false; | ||
3026 | } | 3025 | } |
3027 | 3026 | ||
3028 | logf("commit %ld entries...", tch.entry_count); | 3027 | logf("commit %ld entries...", tch.entry_count); |
@@ -3053,8 +3052,7 @@ static bool commit(void) | |||
3053 | tc_stat.commit_delayed = true; | 3052 | tc_stat.commit_delayed = true; |
3054 | 3053 | ||
3055 | tc_stat.commit_step = 0; | 3054 | tc_stat.commit_step = 0; |
3056 | read_lock--; | 3055 | goto commit_error; |
3057 | return false; | ||
3058 | } | 3056 | } |
3059 | } | 3057 | } |
3060 | 3058 | ||
@@ -3063,8 +3061,7 @@ static bool commit(void) | |||
3063 | logf("Failure to commit numeric indices"); | 3061 | logf("Failure to commit numeric indices"); |
3064 | close(tmpfd); | 3062 | close(tmpfd); |
3065 | tc_stat.commit_step = 0; | 3063 | tc_stat.commit_step = 0; |
3066 | read_lock--; | 3064 | goto commit_error; |
3067 | return false; | ||
3068 | } | 3065 | } |
3069 | 3066 | ||
3070 | close(tmpfd); | 3067 | close(tmpfd); |
@@ -3073,10 +3070,7 @@ static bool commit(void) | |||
3073 | 3070 | ||
3074 | /* Update the master index headers. */ | 3071 | /* Update the master index headers. */ |
3075 | if ( (masterfd = open_master_fd(&tcmh, true)) < 0) | 3072 | if ( (masterfd = open_master_fd(&tcmh, true)) < 0) |
3076 | { | 3073 | goto commit_error; |
3077 | read_lock--; | ||
3078 | return false; | ||
3079 | } | ||
3080 | 3074 | ||
3081 | remove(TAGCACHE_FILE_TEMP); | 3075 | remove(TAGCACHE_FILE_TEMP); |
3082 | 3076 | ||
@@ -3101,39 +3095,53 @@ static bool commit(void) | |||
3101 | tempbuf_size = 0; | 3095 | tempbuf_size = 0; |
3102 | } | 3096 | } |
3103 | 3097 | ||
3104 | #ifdef HAVE_DIRCACHE | ||
3105 | /* Rebuild the dircache, if we stole the buffer. */ | ||
3106 | if (dircache_buffer_stolen) | ||
3107 | dircache_resume(); | ||
3108 | #endif | ||
3109 | |||
3110 | #ifdef HAVE_TC_RAMCACHE | 3098 | #ifdef HAVE_TC_RAMCACHE |
3111 | if (ramcache_buffer_stolen) | 3099 | if (ramcache_buffer_stolen) |
3100 | { | ||
3101 | ramcache_buffer_stolen = false; | ||
3112 | move_lock--; | 3102 | move_lock--; |
3103 | } | ||
3104 | |||
3113 | /* Reload tagcache. */ | 3105 | /* Reload tagcache. */ |
3114 | if (tc_stat.ramcache_allocated > 0) | 3106 | if (tc_stat.ramcache_allocated > 0) |
3115 | tagcache_start_scan(); | 3107 | tagcache_start_scan(); |
3116 | #endif | 3108 | #endif |
3117 | 3109 | ||
3110 | rc = true; | ||
3111 | |||
3112 | commit_error: | ||
3113 | #ifdef HAVE_TC_RAMCACHE | ||
3114 | if (ramcache_buffer_stolen) | ||
3115 | move_lock--; | ||
3116 | #endif | ||
3117 | |||
3118 | read_lock--; | 3118 | read_lock--; |
3119 | |||
3120 | return true; | ||
3121 | } | ||
3122 | 3119 | ||
3123 | #ifndef __PCTOOL__ | 3120 | #ifdef HAVE_DIRCACHE |
3124 | static int tempbuf_handle; | 3121 | /* Resume the dircache, if we stole the buffer. */ |
3122 | if (dircache_buffer_stolen) | ||
3123 | dircache_resume(); | ||
3125 | #endif | 3124 | #endif |
3125 | |||
3126 | return rc; | ||
3127 | } | ||
3126 | 3128 | ||
3127 | static void allocate_tempbuf(void) | 3129 | static void allocate_tempbuf(void) |
3128 | { | 3130 | { |
3129 | /* Yeah, malloc would be really nice now :) */ | 3131 | /* Yeah, malloc would be really nice now :) */ |
3132 | size_t size; | ||
3133 | tempbuf_size = 0; | ||
3134 | |||
3130 | #ifdef __PCTOOL__ | 3135 | #ifdef __PCTOOL__ |
3131 | tempbuf_size = 32*1024*1024; | 3136 | size = 32*1024*1024; |
3132 | tempbuf = malloc(tempbuf_size); | 3137 | tempbuf = malloc(size); |
3133 | #else | 3138 | #else |
3134 | tempbuf_handle = core_alloc_maximum("tc tempbuf", &tempbuf_size, NULL); | 3139 | tempbuf_handle = core_alloc_maximum("tc tempbuf", &size, NULL); |
3135 | tempbuf = core_get_data(tempbuf_handle); | 3140 | tempbuf = core_get_data(tempbuf_handle); |
3136 | #endif | 3141 | #endif |
3142 | |||
3143 | if (tempbuf) | ||
3144 | tempbuf_size = size; | ||
3137 | } | 3145 | } |
3138 | 3146 | ||
3139 | static void free_tempbuf(void) | 3147 | static void free_tempbuf(void) |
@@ -4133,9 +4141,14 @@ static bool load_tagcache(void) | |||
4133 | goto failure; | 4141 | goto failure; |
4134 | } | 4142 | } |
4135 | 4143 | ||
4136 | # ifdef HAVE_DIRCACHE | 4144 | if (global_settings.tagcache_autoupdate) |
4137 | if (dircache_is_enabled()) | ||
4138 | { | 4145 | { |
4146 | /* Check if entry has been removed. */ | ||
4147 | #ifdef HAVE_DIRCACHE | ||
4148 | /* This will be very slow unless dircache is enabled | ||
4149 | or target is flash based. */ | ||
4150 | ################## | ||
4151 | if (dircache_search( /* will get this! -- jethead71 */ | ||
4139 | dc = dircache_get_entry_id(buf); | 4152 | dc = dircache_get_entry_id(buf); |
4140 | if (dc < 0) | 4153 | if (dc < 0) |
4141 | { | 4154 | { |
@@ -4148,24 +4161,17 @@ static bool load_tagcache(void) | |||
4148 | 4161 | ||
4149 | idx->flag |= FLAG_DIRCACHE; | 4162 | idx->flag |= FLAG_DIRCACHE; |
4150 | idx->tag_seek[tag_filename] = dc; | 4163 | idx->tag_seek[tag_filename] = dc; |
4151 | } | 4164 | #else /* ndef HAVE_DIRCACHE */ |
4152 | else | 4165 | /* This will be very slow unless target is flash based; |
4153 | # endif | 4166 | do it anyway for consistency. */ |
4154 | { | 4167 | if (!file_exists(buf)) |
4155 | /* This will be very slow unless dircache is enabled | ||
4156 | or target is flash based, but do it anyway for | ||
4157 | consistency. */ | ||
4158 | /* Check if entry has been removed. */ | ||
4159 | if (global_settings.tagcache_autoupdate) | ||
4160 | { | 4168 | { |
4161 | if (!file_exists(buf)) | 4169 | logf("Entry no longer valid."); |
4162 | { | 4170 | logf("-> %s", buf); |
4163 | logf("Entry no longer valid."); | 4171 | delete_entry(fe->idx_id); |
4164 | logf("-> %s", buf); | 4172 | continue; |
4165 | delete_entry(fe->idx_id); | ||
4166 | continue; | ||
4167 | } | ||
4168 | } | 4173 | } |
4174 | #endif /* HAVE_DIRCACHE */ | ||
4169 | } | 4175 | } |
4170 | 4176 | ||
4171 | continue ; | 4177 | continue ; |