fix(sdk): 评审 p2 修正 — 负 nsec 判 EINVAL / 音频条件等待计数改 5 处

- meow_ui_time.c `__timedwait_cp`:`at->tv_nsec` 是有符号 long,原写法
  `>= 1000000000L` 会让负 nsec 通过(musl 原文用 `>= 1000000000UL`,负值按无符号
  比较同样判 EINVAL)。改为 `< 0 || >= 1000000000L`,与本文件 M11 的
  `__clock_nanosleep` 写法一致;同时避开 `-Wsign-compare`(UL 写法在 -Wextra 下
  会告警)。反汇编确认 llvm 合并成一条 `sltu`,与 musl 的 unsigned 比较等价。
- CLOCK_ABI.md:meow_ui_audio.c 的 pthread_cond_timedwait 调用点由「3 处」改为
  5 处(:312/:351/:417/:431/:499),§5/§6 两处同步;核对文中其它计数(四 App、
  23 项单测)无误。

验证:宿主 gcc -Wall -Wextra 0 warning,test_meow_time64 23 项 PASS、
test_meow_time 回归 PASS;交叉 zig -Wall -Wextra 0 warning;
build_sdk_host.sh --verify 76 成员全 MIPS32r2、0 warning;归档内 meow_ui_time.o
与新鲜交叉构建逐字节一致。
This commit is contained in:
AskaEth committed 2026-11-05 20:46:26 +08:00
1 parent 40ac1e40f0
commit a7bd6c44d9
2 files changed
+6 -3

No files matched your search

+4 -2
View File
@@ -174,7 +174,8 @@ llvm-nm clock_abi_probe_sdk | grep -E 'clock_gettime|nanosleep'
`time()`/`gettimeofday()` 的修正也在同一份归档里生效(链接期覆盖)。
- **同步等待(M16)**:`pthread_cond_timedwait` / `sem_timedwait` / `pthread_join` 超时 /
`aio_suspend` / 非 PI 的 `pthread_mutex_timedlock`/rwlock timed 的**相对超时按真实剩余
时间**生效(不再「亚秒即超时」)。SDK 侧直接受益者是 `meow_ui_audio.c` 的三处条件等待。
时间**生效(不再「亚秒即超时」)。SDK 侧直接受益者是 `meow_ui_audio.c` 的 5 处条件等待
(:312/:351/:417/:431/:499)。
`timerfd_*`、`clock_settime` 一并修正(当前无调用方)。
- 真机写入红线未触碰;本单只改 SDK 源与文档/测试。
@@ -201,7 +202,8 @@ M16 把 zig 0.17 musl 源里所有 `#if defined(SYS_*_time64) && !defined(__ILP3
| `mq/mq_timedsend.c:10` | `mq_timedsend` | 16B 直传 4273 | 未修(未用) |
| `thread/pthread_mutex_timedlock.c:8` | PI 互斥量的 timedlock 快路径 | 16B 直传 4238(`FUTEX_LOCK_PI`) | 未修(非 PI 走已修的 `__timedwait`;SDK/App 不用 PI 互斥量) |
唯一在用的受害者是 futex:`meow_ui_audio.c`(3 处)、`meow_audiod`、ncm 播放线程都用
唯一在用的受害者是 futex:`meow_ui_audio.c`(5 处,:312/:351/:417/:431/:499)、
`meow_audiod`、ncm 播放线程都用
`pthread_cond_timedwait`,修复前「剩 0.4s」会被内核当成 `{0,0}` 立即超时 → 音频环形缓冲
的等待退化成忙轮询。
+2 -1
View File
@@ -246,7 +246,8 @@ int __timedwait_cp(volatile int *addr, int val, clockid_t clk,
if (priv) priv = MEOW_FUTEX_PRIVATE;
if (at) {
if (at->tv_nsec >= 1000000000L) return EINVAL;
/* musl 原文是 `>= 1000000000UL`(负值按无符号也判 EINVAL);显式判负以保 -Wextra 0 warning */
if (at->tv_nsec < 0 || at->tv_nsec >= 1000000000L) return EINVAL;
if (__clock_gettime(clk, &to)) return EINVAL;
to.tv_sec = at->tv_sec - to.tv_sec;
if ((to.tv_nsec = at->tv_nsec - to.tv_nsec) < 0) {