REFERENCE · CORE

Runtime 与 cppgc

职责。 Runtime 把“可以进入 JavaScript”的权力集中在一个对象里。网络、存储和 trace 模块不能直接持有 Isolate 并自行调用。

线程与 handle

cppgc wrapper

JS 可见宿主类型继承 v8::Object::Wrappable,由 MakeGarbageCollected 创建。C++ GC 关系使用 cppgc::Member<T>,并在 Trace() 中访问:

void Response::Trace(cppgc::Visitor* visitor) const {
  v8::Object::Wrappable::Trace(visitor);
  visitor->Trace(bodyStream);
  visitor->Trace(cachedJsObject);
}

kj::Own 不受 cppgc 管理;不要把必须确定析构的 socket、file 或 RocksDB handle 交给 tracing GC。cppgc 适合 JS/C++ 对象图,不适合 I/O 资源所有权。

关闭顺序

  1. 停止 accept 新 HTTP/WebSocket。
  2. 拒绝新 timer、waitUntil 和 storage job。
  3. 关闭 WebSocket,drain 请求和后台 TaskSet。
  4. drain StorageExecutor 与 TraceWriter。
  5. 清空 JS Globals 和 Context。
  6. Dispose Isolate,再 Dispose V8 Platform。

析构函数不得偷偷进入 V8。需要 JS 清理时在第 3 步显式完成。