plugins: properties: further reduce stack pressure
rockbox-gerrit-noreply--- via rockbox-cvs <[email protected]> Fri, 29 May 2026 15:12:04 -0400
| Newsgroups | gmane.comp.systems.archos.rockbox.cvs |
|---|---|
| Message-ID | <[email protected]> |
commit 3507f32d019a2894d8b297c0f35d4ee65473a7be Author: Christian Soffke <[email protected]> Date: Fri May 29 20:40:25 2026 +0200 plugins: properties: further reduce stack pressure Follow-up to 9f20c45. tagtree.c's retrieve_entries has significant stack usage (>1.5k) and is called from tagtree_entries_iterate. Further Reduce stack usage of tagtree_entries_iterate, going from 784 B to 72 B, by using static memory allocation for the the tagcache_search struct in the Properties plugin. Change-Id: I75a170bea1c5392c18a891844a0ff31fbd2114eb diff --git a/apps/plugin.c b/apps/plugin.c index 282b0dcd51..98b9364c98 100644 --- a/apps/plugin.c +++ b/apps/plugin.c @@ -701,6 +701,7 @@ static const struct plugin_api rockbox_api = { count_mp3_frames, create_xing_header, #ifdef HAVE_TAGCACHE + tagtree_entries_iterate, tagcache_search, tagcache_search_set_uniqbuf, tagcache_search_add_filter, @@ -714,9 +715,8 @@ static const struct plugin_api rockbox_api = { tagcache_is_in_ram, #if defined(HAVE_DIRCACHE) tagcache_fill_tags, -#endif -#endif - tagtree_entries_iterate, +#endif /* HAVE_DIRCACHE */ +#endif /* HAVE_TC_RAMCACHE */ #endif /* HAVE_TAGCACHE */ #ifdef HAVE_ALBUMART diff --git a/apps/plugin.h b/apps/plugin.h index 73262cd8eb..584836e618 100644 --- a/apps/plugin.h +++ b/apps/plugin.h @@ -180,7 +180,7 @@ int plugin_open(const char *plugin, const char *parameter); * when this happens please take the opportunity to sort in * any new functions "waiting" at the end of the list. */ -#define PLUGIN_API_VERSION 283 +#define PLUGIN_API_VERSION 284 /* 239 Marks the removal of ARCHOS HWCODEC and CHARCELL */ @@ -824,6 +824,9 @@ struct plugin_api { void (*progressfunc)(int), bool generate_toc, unsigned char* tempbuf, size_t tempbuf_len); #ifdef HAVE_TAGCACHE + bool (*tagtree_entries_iterate)(struct tagcache_search *tcs, + bool (*action_cb)(const char *file_name), + char *buf, size_t buf_sz); bool (*tagcache_search)(struct tagcache_search *tcs, int tag); void (*tagcache_search_set_uniqbuf)(struct tagcache_search *tcs, void *buffer, long length); @@ -840,10 +843,8 @@ struct plugin_api { bool (*tagcache_is_in_ram)(void); #if defined(HAVE_DIRCACHE) bool (*tagcache_fill_tags)(struct mp3entry *id3, const char *filename); -#endif -#endif - bool (*tagtree_entries_iterate)(bool (*action_cb)(const char *file_name), - char *buf, size_t buf_sz); +#endif /* HAVE_DIRCACHE */ +#endif /* HAVE_TC_RAMCACHE */ #endif /* HAVE_TAGCACHE */ #ifdef HAVE_ALBUMART diff --git a/apps/plugins/properties.c b/apps/plugins/properties.c index 00d293cfb9..f5abb701db 100644 --- a/apps/plugins/properties.c +++ b/apps/plugins/properties.c @@ -34,6 +34,9 @@ enum props_types { PROPS_DIR }; +#ifdef HAVE_TAGCACHE +static struct tagcache_search tcs; +#endif static struct gui_synclist properties_lists; static struct mp3entry id3; static struct tm tm; @@ -307,8 +310,8 @@ static bool assemble_track_info(const char *filename, struct dir_stats *stats) return false; #ifdef HAVE_TAGCACHE else if (props_type == PROPS_MUL_ID3 && - !rb->tagtree_entries_iterate(&mul_id3_add, str_filename, - sizeof str_filename)) + !rb->tagtree_entries_iterate(&tcs, &mul_id3_add, str_filename, + sizeof str_filename)) return false; #endif diff --git a/apps/tagtree.c b/apps/tagtree.c index 7b8af2618e..9b39fc57e9 100644 --- a/apps/tagtree.c +++ b/apps/tagtree.c @@ -1795,7 +1795,7 @@ static int retrieve_entries(struct tree_context *c, int offset, bool init) { /* Fallback to basename */ char *lastname = dptr->name; dptr->name = core_get_data(c->cache.name_buffer_handle)+namebufused; - if ((c->cache.name_buffer_size - namebufused) > 0 && + if ((c->cache.name_buffer_size - namebufused) > 0 && tagcache_retrieve(&tcs, tcs.idx_id, tag_virt_basename, dptr->name, c->cache.name_buffer_size - namebufused)) { @@ -2654,10 +2654,10 @@ static bool tagtree_insert_selection(int position, bool queue, * callback function parameter. Parameter will be NULL for * entries whose filename couldn't be retrieved. */ -bool tagtree_entries_iterate(bool (*action_cb)(const char *file_name), +bool tagtree_entries_iterate(struct tagcache_search *tcs, + bool (*action_cb)(const char *file_name), char* buf, size_t buf_sz) { - struct tagcache_search tcs; int i, n; unsigned long last_tick; int ret = true; @@ -2668,7 +2668,7 @@ bool tagtree_entries_iterate(bool (*action_cb)(const char *file_name), cpu_boost(true); if (!goto_allsubentries(newtable)) ret = false; - else if (tagcache_search(&tcs, tag_filename)) + else if (tagcache_search(tcs, tag_filename)) { last_tick = current_tick + HZ/2; splash_progress_set_delay(HZ / 2); /* wait 1/2 sec before progress */ @@ -2684,8 +2684,8 @@ bool tagtree_entries_iterate(bool (*action_cb)(const char *file_name), last_tick = current_tick; } - if (!action_cb(tagcache_retrieve(&tcs, tagtree_get_entry(tc, i)->extraseek, - tcs.type, buf, buf_sz) ? buf : NULL)) + if (!action_cb(tagcache_retrieve(tcs, tagtree_get_entry(tc, i)->extraseek, + tcs->type, buf, buf_sz) ? buf : NULL)) { ret = false; break; @@ -2693,7 +2693,7 @@ bool tagtree_entries_iterate(bool (*action_cb)(const char *file_name), yield(); } - tagcache_search_finish(&tcs); + tagcache_search_finish(tcs); } else { diff --git a/apps/tagtree.h b/apps/tagtree.h index 7134f827a0..b838a4b630 100644 --- a/apps/tagtree.h +++ b/apps/tagtree.h @@ -47,7 +47,8 @@ int tagtree_get_icon(struct tree_context* c); int tagtree_get_filename(struct tree_context* c, char *buf, int buflen); int tagtree_get_custom_action(struct tree_context* c); bool tagtree_get_subentry_filename(char *buf, size_t bufsize); -bool tagtree_entries_iterate(bool (*action_cb)(const char *file_name), +bool tagtree_entries_iterate(struct tagcache_search *tcs, + bool (*action_cb)(const char *file_name), char *buf, size_t buf_sz); #endif -- rockbox-cvs mailing list [email protected] https://lists.haxx.se/mailman/listinfo/rockbox-cvs