mirror of
https://github.com/pjh456/OxideJS.git
synced 2026-10-24 18:51:13 +08:00
feat: VmHost 加 BroadcastChannel 注册表三方法并 full_reset 清表
This commit is contained in:
@@ -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()
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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>>,
|
||||
}
|
||||
|
||||
|
||||
@@ -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;
|
||||
|
||||
Reference in New Issue
Block a user