src/webrtc.rs:370-373
🟡 中
当 self.rtc.poll_output() 返回 Err 时,代码仅记录日志后 break 退出循环,最终返回 Ok(false)。这意味着上层 WebRtcState::poll_rtc 无法感知内部 Rtc 已进入不可恢复的错误状态,self.inner 不会被清理。后续每次调用都会重复同样的日志→继续循环的模式,形成无效轮询。
self.rtc.poll_output()
Err
break
Ok(false)
WebRtcState::poll_rtc
self.inner
对于不可恢复的错误,返回 Err 让上层决定是否销毁 inner;或者至少返回 Ok(true) 触发清理路径:
inner
Ok(true)
Err(e) => { tracing::error!("rtc.poll_output error: {e}"); return Err(anyhow::anyhow!("rtc.poll_output: {e}")); }
或者更简单的方案(与 issue #10 配合):
Err(e) => { tracing::error!("rtc.poll_output error: {e}"); return Ok(true); // 触发 inner 销毁 }
按 Oracle 建议采用方案 B:不仅修复 Err 分支,同时修复 write_h264_frame 中清理信号丢失问题。
write_h264_frame
src/webrtc.rs 3 处修改
1. WebRtcInner::poll_rtc Err 分支(line 380)
WebRtcInner::poll_rtc
self.connected = false; return Ok(true)
2. WebRtcInner::write_h264_frame(line 427)
WebRtcInner::write_h264_frame
Result<()>
Result<bool>
poll_rtc()
should_destroy
3. WebRtcState::write_h264_frame(line 248)
WebRtcState::write_h264_frame
self.inner = None
IceConnectionState::Failed
Closed
cargo build
Commit: f3da1e4
f3da1e4
No dependencies set.
The note is not visible to the blocked user.
位置
src/webrtc.rs:370-373严重性
🟡 中
问题描述
当
self.rtc.poll_output()返回Err时,代码仅记录日志后break退出循环,最终返回Ok(false)。这意味着上层WebRtcState::poll_rtc无法感知内部 Rtc 已进入不可恢复的错误状态,self.inner不会被清理。后续每次调用都会重复同样的日志→继续循环的模式,形成无效轮询。建议修复
对于不可恢复的错误,返回
Err让上层决定是否销毁inner;或者至少返回Ok(true)触发清理路径:或者更简单的方案(与 issue #10 配合):
修复方案(Oracle 审核)
按 Oracle 建议采用方案 B:不仅修复
Err分支,同时修复write_h264_frame中清理信号丢失问题。改动清单
1.
WebRtcInner::poll_rtcErr 分支(line 380)break→self.connected = false; return Ok(true)2.
WebRtcInner::write_h264_frame(line 427)Result<()>→Result<bool>poll_rtc()的清理信号(should_destroy)3.
WebRtcState::write_h264_frame(line 248)should_destroy,触发时self.inner = NoneResult<()>,外部调用方无需变更未改动
IceConnectionState::Failed/Closed:str0m 0.20.0 的 is 0.9.1 中这两个变体已被注释掉,不存在验证
cargo build编译通过(无新增 warning)Commit:
f3da1e4