feat: VmHost 加 BroadcastChannel 注册表三方法并 full_reset 清表

This commit is contained in:
2026-10-09 05:15:37 +00:00
parent 2fce99e3ba
commit d7a10f0f44
6 changed files with 68 additions and 22 deletions
+23
View File
@@ -357,4 +357,27 @@ impl oxide_runtime_api::VmHost for Vm {
fn atomics_wake_waiters(&mut self, buffer: *mut JsObject, offset: usize, count: f64) -> usize {
self.atomics_wake_waiters(buffer, offset, count)
}
fn bc_register(&self, name: &str, port: *mut JsObject) {
self.realm
.gc
.borrow_mut()
.broadcast_channels
.entry(name.to_string())
.or_default()
.push(port);
}
fn bc_unregister(&self, name: &str, port: *mut JsObject) {
if let Some(v) = self.realm.gc.borrow_mut().broadcast_channels.get_mut(name) {
v.retain(|p| *p != port);
}
}
fn bc_lookup(&self, name: &str) -> Vec<*mut JsObject> {
self.realm
.gc
.borrow()
.broadcast_channels
.get(name)
.cloned()
.unwrap_or_default()
}
}
+1 -2
View File
@@ -63,8 +63,7 @@ pub(crate) struct GcState {
pub(crate) gc_pressure_mode: bool,
/// BroadcastChannel per-realm 弱引用注册表:通道名 → 通道对象裸指针列表
/// (弱引用,不保活)。构造器分配后登记、close 注销、GC sweep 按 mark 位
/// 剪枝。当前仅声明,不填不读(登记与剪枝由后续任务接线)。
#[allow(dead_code)]
/// 剪枝、full_reset 随 session 对象一并清表。
pub(crate) broadcast_channels: HashMap<String, Vec<*mut JsObject>>,
}
+3
View File
@@ -466,6 +466,9 @@ impl Vm {
// 否则下次命中返回悬垂指针。
self.number_to_string_cache_keys = [0u64; 16];
self.number_to_string_cache_vals = [JsValue::undefined(); 16];
// BroadcastChannel 注册表持 session 对象裸指针:teardown 释放全部
// session 对象前须清表,否则残留悬垂指针。
self.realm.gc.borrow_mut().broadcast_channels.clear();
self.realm.teardown_session_heap_data();
self.realm.gc.borrow_mut().session_bytes_allocated = 0;
self.realm.gc.borrow_mut().session_bytes_peak = 0;