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:
1 parent
40ac1e40f0
commit
a7bd6c44d9
2 files changed
+6
-3
No files matched your search
@@ -174,7 +174,8 @@ llvm-nm clock_abi_probe_sdk | grep -E 'clock_gettime|nanosleep'
|
|||||||
`time()`/`gettimeofday()` 的修正也在同一份归档里生效(链接期覆盖)。
|
`time()`/`gettimeofday()` 的修正也在同一份归档里生效(链接期覆盖)。
|
||||||
- **同步等待(M16)**:`pthread_cond_timedwait` / `sem_timedwait` / `pthread_join` 超时 /
|
- **同步等待(M16)**:`pthread_cond_timedwait` / `sem_timedwait` / `pthread_join` 超时 /
|
||||||
`aio_suspend` / 非 PI 的 `pthread_mutex_timedlock`/rwlock timed 的**相对超时按真实剩余
|
`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` 一并修正(当前无调用方)。
|
`timerfd_*`、`clock_settime` 一并修正(当前无调用方)。
|
||||||
- 真机写入红线未触碰;本单只改 SDK 源与文档/测试。
|
- 真机写入红线未触碰;本单只改 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 | 未修(未用) |
|
| `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 互斥量) |
|
| `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}` 立即超时 → 音频环形缓冲
|
`pthread_cond_timedwait`,修复前「剩 0.4s」会被内核当成 `{0,0}` 立即超时 → 音频环形缓冲
|
||||||
的等待退化成忙轮询。
|
的等待退化成忙轮询。
|
||||||
|
|
||||||
|
|||||||
@@ -246,7 +246,8 @@ int __timedwait_cp(volatile int *addr, int val, clockid_t clk,
|
|||||||
if (priv) priv = MEOW_FUTEX_PRIVATE;
|
if (priv) priv = MEOW_FUTEX_PRIVATE;
|
||||||
|
|
||||||
if (at) {
|
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;
|
if (__clock_gettime(clk, &to)) return EINVAL;
|
||||||
to.tv_sec = at->tv_sec - to.tv_sec;
|
to.tv_sec = at->tv_sec - to.tv_sec;
|
||||||
if ((to.tv_nsec = at->tv_nsec - to.tv_nsec) < 0) {
|
if ((to.tv_nsec = at->tv_nsec - to.tv_nsec) < 0) {
|
||||||
|
|||||||
Reference in new issue
Block a user