fix(ncm §31): 修两处 UI 数据竞态——返回首页行空白(staging发布) + 进第二个歌单显示上一歌单(换歌单清窗)
A. 返回首页各行 2~3s 空白:appstate_load_playlists 就地 memset(g_st.playlists[]) 与 home_src2 无锁逐行绑定竞态,刷新期间 playlist_count 保留旧值 → UI 读清零行。 照搬 s_build[] staging 范式:网络落 s_pls[] → 成功后锁内原子发布(拷回+更新count), 失败保留旧快照(断网离线浏览)。绝不就地清零 UI 可见数组。 B. 进第二个歌单显示上一歌单:playlist_open/refresh 同步路径不调 appstate_playlist_reset, pl_apply(1) 绑到上一歌单残留窗口(track_ids_count/songs)。 新增窗口归属(歌单 id 唯一标识, 对搜索歌单同样成立): worker 首屏发布后 appstate_playlist_window_set;refresh 目标≠归属(窗口is) → 同步 reset 再 pl_apply。 同歌单手动刷新(id 同)保留旧内容(stale-while-revalidate)。 宿主回归:playlist_race_sim(新 F 并发读无清零态/G 开A→开B 不串)、window/search/ cache_evict/player_flow/stream_sim、test_ncm_core 宿主+mipsel 全 PASS; build_ncm.sh -Wall -Wextra 0 warning;0 真实请求;未部署。
This commit is contained in:
1 parent
97b741cf56
commit
10690bc348
9 files changed
+290
-9
No files matched your search
@@ -358,6 +358,12 @@ int appstate_playlist_open_gen(void); /* 当前打开代次(0=从未
|
||||
int appstate_playlist_open_idx(void); /* 当前打开目标下标(-2=搜索歌单哨兵;-1=无) */
|
||||
int appstate_playlist_begin(int idx); /* 递增代次并记目标;返回新代次(UI 打开/刷新时调) */
|
||||
void appstate_playlist_reset(void); /* 清窗口/索引(UI 丢弃过期结果、在播安全)。加锁。 */
|
||||
/* 窗口归属(§NEW bug B:新进歌单显示上一个歌单内容)——
|
||||
* worker 首屏发布窗口后 appstate_playlist_window_set 标记
|
||||
* 归属歌单 id;playlist_refresh 在换歌单前用 window_is 判
|
||||
* 目标≠归属 → 同步 reset 清窗,防「开 B 显示 A」。 */
|
||||
void appstate_playlist_window_set(const char *plid); /* 标记当前窗口归属歌单 id */
|
||||
int appstate_playlist_window_is(const char *plid); /* 1=窗口归属该歌单(换歌单清窗判据) */
|
||||
int appstate_load_playlist_songs_ctx(const ncm_playlist_t *pl, int is_search,
|
||||
int ctx_gen, int ctx_idx, int offset, int limit);
|
||||
/* 快照式加载(歌单详情/曲目物化):
|
||||
|
||||
Reference in new issue
Block a user