diff --git a/patch_v2/sdk/CLOCK_ABI.md b/patch_v2/sdk/CLOCK_ABI.md index 18df71f..81b4932 100644 --- a/patch_v2/sdk/CLOCK_ABI.md +++ b/patch_v2/sdk/CLOCK_ABI.md @@ -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}` 立即超时 → 音频环形缓冲 的等待退化成忙轮询。 diff --git a/patch_v2/sdk/meow_ui_time.c b/patch_v2/sdk/meow_ui_time.c index 765d5d2..1b1139a 100644 --- a/patch_v2/sdk/meow_ui_time.c +++ b/patch_v2/sdk/meow_ui_time.c @@ -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) {