nodejs / node-chakracore

Node.js on ChakraCore :sparkles::turtle::rocket::sparkles:
Other
1.92k stars 342 forks source link

ContextShim is leaking #627

Open rgurzhiy opened 4 years ago

rgurzhiy commented 4 years ago

In deps/chakrashim/src/jsrtisolateshim.cc there is a statement CHAKRA-TODO: This is not called after cross context work in chakra. Fix this else we will leak chakrashim object. JsContextBeforeCollectCallback is never called, so ContextShim, saved as void* data in JSContextRef is leaking.

The problem is in deps/chakrashim/src/inspector/inspected-context.cc.

As far as I understand from deps/chakrashim/core/lib/Common/Memory/Recycler.cpp Recycler::SetObjectBeforeCollectCallback we only allow 1 callback per object.

We configure required callback in IsolateShim::NewContext after ContextShim creation and then, when inspector starts in src/node.cc bool StartInspector(Environment* env, const char* script_path, std::shared_ptr<DebugOptions> options) it needs to set a weak reference with callback for our context deps/chakrashim/src/inspector/inspected-context.cc m_context.SetWeak(this, &InspectedContext::weakCallback, v8::WeakCallbackType::kParameter);. As a result the required JsContextBeforeCollectCallback is being lost.

After compiling node-chakracore setting --without-inspector flag JsContextBeforeCollectCallback is being called duringJsDisposeRuntime.

I'm new to node-chakracore, so I don't know how to fix the issue properly. But this info could be useful for you guys.