修复E-03:s_net_errno 改按任务隔离槽位,消除跨任务错误码错报

This commit is contained in:
2026-09-25 19:17:18 +08:00
parent 78ea81aecb
commit 1b46e2a340
4 changed files with 756 additions and 681 deletions
File diff suppressed because it is too large Load Diff
+12 -2
View File
@@ -261,8 +261,18 @@ int net_set_event_cb(int sockfd, net_event_cb_t cb, void *arg);
*/
/*
* 函数功能:获取 socket 最后错误码
* 返回值:错误码(NET_ERR_xxx)
* 函数功能:获取 **本任务** 最后一次 net_*() 调用失败时的精确错误码
* 入口参数:无
* 出口参数:无
* 返回值:错误码(NET_ERR_xxx);本任务尚无失败记录时为 NET_OK(0)
* 限定条件:无(任何上下文可调用,含中断——查询为纯本任务索引读)
* 函数说明:1. **按任务隔离**(2026-09-25 E-03 修复):错误码存在每个任务自己的
* 槽位里,任务间互不干扰,不存在跨任务覆写竞态——旧实现的单一全局
* 变量会被 netTask/其他任务的 net 调用交错覆盖,调用方可能读到别人的码
* 2. 语义:本任务最后一次返回 -1 的 net_*() 调用所对应的精确码;
* 调用成功时**不清零**(与本 API 历史行为一致,保持向后兼容)
* 3. 任务句柄槽位用尽时回退到共享槽位(仅影响排障,不影响功能)
* 4. 超时类场景(net_recv_to)请直接用返回码 -2 判定,不要依赖本接口
*/
int net_get_errno(void);
+1 -1
View File
@@ -27,4 +27,4 @@
| # | 事项 | 说明 | 出处 |
|---|---|---|---|
| N-4 | **pending 机制二期:ACCEPT + SEND 阻塞路径 pending 化**——E-06(accept 轮询计时失真)、E-20(lftpd 控制通道 errno 分类/501)、E-21(timeSync errno 分级)剩余分量共用该机制扩展;届时 L3/L5 基线再重锁、探针族扩充(close/reconfig/EOF/disconnect-during-pending)、看门狗接 selftest 留痕、模拟器差距清单 +1 | 一期(RECV)已落地:`f16dc9a`;设计基线与门禁结果见 `docs/问题记录/Net层阻塞模型业界对照与演进方案.md` §6.7 | 同左 + `错误码传播审计.md` 第二档 #1 |
| N-5 | E-03(`s_net_errno` 跨任务覆写竞态)——pending 化不改变 errno 通道现状;与 N-4 二期或独立小修(错误码经通知值直回,包装器去全局) | 既有 P1 | `错误码传播审计.md` E-03 |
| N-5 | **✅ 已修复(2026-09-25):E-03 `s_net_errno` 跨任务覆写竞态**——采取"**按任务隔离**"路线(而非二期 pending 化):删除全局 `s_net_errno`,改为 `s_net_errno_slots[8]`(每槽 `{任务句柄, err}`);`net_errno_slot()` 无锁快路径只读命中本任务槽、首次占用在 `taskENTER_CRITICAL` 内复查(槽位用尽回退 [0] 槽,**不新增共享槽**以免把竞态带回来);`net_set_errno()` 取代全部赋值、`NET_ERR_RETURN_1()` 宏合并"记码+return -1"共 82 处;`net_get_errno()` 改读本任务槽位、**对外语义不变**(成功不清零)。构建 0 错 0 警 + cppcheck 无告警 + `git diff --check` 干净 + 编码无 `U+FFFD`,BSS +64B。**残留台架项**:本机 COM6 未枚举(ST-Link 虚拟串口不在)→ 硬件闭环回归待补(`错误码传播审计.md` §3.1 E-03 / 页脚) | 2026-09-25 修复 | `错误码传播审计.md` E-03;`Drivers/BSP/NET/net_socket.c`(`net_errno_slot` / `net_set_errno` / `net_get_errno`) |
File diff suppressed because it is too large Load Diff