280 歌单链路三修:开A→开B 竞态防串(5194 串数据) + 92/200 批边界 Load Failed + 歌单列表盘缓存 + 孤儿 .part 回收
ncm_app(REPORT §26, ncm 158ec367 未部署留主会话): - 打开时快照 plid+代次:appstate_playlist_begin/open_gen/open_idx/reset + appstate_load_playlist_songs_ctx(快照 pl 不读 g_st.playlists[],detail 结果落 staging 锁内原子发布,代次/目标不匹配判 NCM_ERR_STALE 不写全局);playlist_tick 过期丢弃 + appstate_playlist_reset 清窗口防串。修 5194「我喜欢的音乐」3 首/串数据。 - appstate_song_ensure_range fill-and-continue:bn<m 部分返回/单批网络失败非致命 (记 NCM_ERR_NOTFOUND/r2),已物化保留+占位行;worker 首屏 track_ids_count>0 降级非致命(snack)。修 92/200 首歌单点开整页 Load Failed。 - 歌单列表盘缓存 <data_dir>/playlists.bin(magic+ver+ts+数组):home_reload 先缓存 秒渲 + 后台静默刷新,刷新失败有数据不置错态。修返回首页卡 LOADING(275 遗留)。 - 孤儿 .part/.tmp:evict/total_bytes LRU 扫描顺续删 mtime>7 天(in-flight mtime 新鲜安全)。 验证:新 bench/playlist_race_sim(竞态防串/批边界/非致命/盘缓存/reset)+cache_evict_sim case9(7 天回收)+window/pagination/search/stream_sim 零回归+test_ncm_core host+mipsel PASS;build_ncm.sh -Wall -Wextra 0 warning(text 978354/bss 1496484);0 真实请求。 遗留:appstate_logout 未联动删 playlists.bin;g_st.playlists[] 快照拷贝仍有极小交错窗。
This commit is contained in:
1 parent
d8eeef5c57
commit
f0b73e119d
11 files changed
+744
-48
No files matched your search
@@ -337,6 +337,8 @@ int appstate_song_ensure_range(int lo, int hi);
|
||||
* 窗口未覆盖先滑窗(重叠区保留,出窗槽位失效);
|
||||
* 缺失槽位先读盘缓存(<cache_dir>/meta/<id>.bin),
|
||||
* miss 攒批 ≤NCM_SONG_BATCH 走 song_detail,成功落盘。
|
||||
* 批内部分返回/单批网络失败不再整段置失败——已物化槽保留,
|
||||
* 缺槽留 invalid(下次 ensure 再试),返回仍为 NCM_OK(§26)。
|
||||
* worker 线程调用(含网络);返回 NCM_OK/负错误码。 */
|
||||
int appstate_range_loaded(int lo, int hi); /* 1=[lo,hi) 全部在窗内且有效(UI 判是否需 ensure) */
|
||||
int appstate_song_copy(int gidx, ncm_song_t *out); /* 锁内读窗:0=已物化拷出;-1=窗外/未物化 */
|
||||
@@ -345,6 +347,32 @@ int appstate_song_fetch(int gidx, ncm_song_t *out); /* 任意全局下标物化
|
||||
void appstate_adopt_songs(int n); /* 收编外部已填的 songs[0..n)(搜索结果)为窗口 base=0,
|
||||
* 同步 song_ids/track_ids_count(播放上下文) */
|
||||
|
||||
/* ---- 歌单加载上下文(§26 开A→未载完→开B 竞态防串)----
|
||||
* UI(playlist.c)在每次打开/刷新歌单时调用 appstate_playlist_begin 记录「代次+目标」,
|
||||
* worker 用同一代次调 appstate_load_playlist_songs_ctx;加载完成时若代次/目标已不匹配,
|
||||
* 结果判过期丢弃(NCM_ERR_STALE),防「前一次加载的 worker 结果落进新打开的歌单」。 */
|
||||
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 丢弃过期结果、在播安全)。加锁。 */
|
||||
int appstate_load_playlist_songs_ctx(const ncm_playlist_t *pl, int is_search,
|
||||
int ctx_gen, int ctx_idx, int offset, int limit);
|
||||
/* 快照式加载(歌单详情/曲目物化):
|
||||
* pl = 打开时快照(不读 g_st.playlists[],防
|
||||
* home_worker 并发 memset 污染 id);
|
||||
* is_search = 1=搜索歌单(NCM_PL_SEARCH 哨兵);
|
||||
* ctx_gen/ctx_idx = begin() 返回的代次与目标,加载中/末
|
||||
* 验不匹配 → NCM_ERR_STALE(不写全局);
|
||||
* ctx_gen < 0 = 不校验(兼容既有调用方/测试)。
|
||||
* offset=0 重头(detail 全量 trackIds 重建索引+清窗口);
|
||||
* offset>0 = 物化 [offset,offset+limit)(滑窗+盘缓存+补载)。 */
|
||||
|
||||
/* ---- 歌单列表磁盘缓存(§26,NCM_CACHE_DESIGN §2.2)----
|
||||
* 快照 <data_dir>/playlists.bin(magic/ver/时间戳 + 数组)。进首页先渲染缓存秒开,
|
||||
* 后台 worker 拉网络成功后覆写缓存(stale-while-revalidate);断网时列表可离线浏览。 */
|
||||
int appstate_playlists_cache_load(int64_t *ts_out); /* 0=命中(g_st.playlists/playlist_count 已填) */
|
||||
int appstate_playlists_cache_save(void); /* 把当前 g_st.playlists/playlist_count 落盘 */
|
||||
|
||||
/* ---- 播放队列来源(§23)---- */
|
||||
void appstate_set_queue(int src); /* NCM_QUEUE_PLAYLIST / NCM_QUEUE_SEARCH */
|
||||
int appstate_get_queue(void);
|
||||
|
||||
Reference in new issue
Block a user