v8 Persistent SetWeak 崩溃 NEAR_DEATH
v8 Persistent SetWeak crashed with NEAR_DEATH
我的代码:
struct WeakData {
context* c;
std::vector<UniquePersistent<Object>>::iterator i;
};
void WeakPtrCallback(const v8::WeakCallbackData<v8::Object, WeakData>& data) {
printf("weak callback");
fflush(stdout);
// crashes always after exit from this callback
}
Local<Object> wrapDocumentSelection(Isolate* isolate, cDocumentSelection* selection) {
EscapableHandleScope handle_scope(isolate);
auto ctx = isolate->GetCurrentContext();
Context::Scope context_scope(ctx);
Local<External> contextWrap = Local<External>::Cast(
Handle<Object>::Cast(isolate->GetCurrentContext()->Global()->GetPrototype())->GetInternalField(0));
context* c = static_cast<context*>(contextWrap->Value());
Local<ObjectTemplate> documentSelectionTemplate = Local<ObjectTemplate>::New(isolate, c->documentSelectionTemplate);
Local<Object> jsSelection = documentSelectionTemplate->NewInstance(ctx).ToLocalChecked();
jsSelection->SetInternalField(0, External::New(isolate, selection));
jsSelection->Set(ctx, String::NewFromUtf8(isolate, "length"), Integer::New(isolate, selection->Length));
c->trackingObjects.push_back(UniquePersistent<Object>(isolate, jsSelection));
auto &p = c->trackingObjects.back();
auto it = c->trackingObjects.end();
it--;
WeakData* wd = new WeakData;
wd->c = c;
wd->i = it;
p.Reset(isolate, jsSelection);
p.SetWeak<WeakData>(NULL, WeakPtrCallback);
isolate->AdjustAmountOfExternalAllocatedMemory(1024);
return handle_scope.Escape(jsSelection);
}
在上下文中,我保留了所有持久句柄的向量,同时
在 WeakPtrCallback 中,我需要清理一些外部分配的资源
v8 错误:
#
# Fatal error in ../src/global-handles.cc, line 325
# Check failed: state() != NEAR_DEATH.
#
关于 https://strongloop.com/strongblog/node-js-v0-12-c-apis-breaking/
我不需要在回调中执行任何与 v8 相关的清理
The persistent's storage cell is automatically disposed. Keep a reference to the original v8::Persistent if you want to revive it with .ClearWeak().
我也尝试使用 Persistent 和 Persistent<Value, CopyablePersistentTraits<Value>>
- 同样的错误...
有什么建议吗?
好吧,看来我的C++不够好
我找到了向量问题,由于某种原因它无法正确删除所需的元素,我猜迭代器是 index-bound,因此删除一些先前的元素会破坏所有进一步的迭代器引用...
切换到 std::map 以不断递增的计数器作为关键完全解决了问题
我的代码:
struct WeakData {
context* c;
std::vector<UniquePersistent<Object>>::iterator i;
};
void WeakPtrCallback(const v8::WeakCallbackData<v8::Object, WeakData>& data) {
printf("weak callback");
fflush(stdout);
// crashes always after exit from this callback
}
Local<Object> wrapDocumentSelection(Isolate* isolate, cDocumentSelection* selection) {
EscapableHandleScope handle_scope(isolate);
auto ctx = isolate->GetCurrentContext();
Context::Scope context_scope(ctx);
Local<External> contextWrap = Local<External>::Cast(
Handle<Object>::Cast(isolate->GetCurrentContext()->Global()->GetPrototype())->GetInternalField(0));
context* c = static_cast<context*>(contextWrap->Value());
Local<ObjectTemplate> documentSelectionTemplate = Local<ObjectTemplate>::New(isolate, c->documentSelectionTemplate);
Local<Object> jsSelection = documentSelectionTemplate->NewInstance(ctx).ToLocalChecked();
jsSelection->SetInternalField(0, External::New(isolate, selection));
jsSelection->Set(ctx, String::NewFromUtf8(isolate, "length"), Integer::New(isolate, selection->Length));
c->trackingObjects.push_back(UniquePersistent<Object>(isolate, jsSelection));
auto &p = c->trackingObjects.back();
auto it = c->trackingObjects.end();
it--;
WeakData* wd = new WeakData;
wd->c = c;
wd->i = it;
p.Reset(isolate, jsSelection);
p.SetWeak<WeakData>(NULL, WeakPtrCallback);
isolate->AdjustAmountOfExternalAllocatedMemory(1024);
return handle_scope.Escape(jsSelection);
}
在上下文中,我保留了所有持久句柄的向量,同时 在 WeakPtrCallback 中,我需要清理一些外部分配的资源
v8 错误:
#
# Fatal error in ../src/global-handles.cc, line 325
# Check failed: state() != NEAR_DEATH.
#
关于 https://strongloop.com/strongblog/node-js-v0-12-c-apis-breaking/ 我不需要在回调中执行任何与 v8 相关的清理
The persistent's storage cell is automatically disposed. Keep a reference to the original v8::Persistent if you want to revive it with .ClearWeak().
我也尝试使用 Persistent 和 Persistent<Value, CopyablePersistentTraits<Value>>
- 同样的错误...
有什么建议吗?
好吧,看来我的C++不够好 我找到了向量问题,由于某种原因它无法正确删除所需的元素,我猜迭代器是 index-bound,因此删除一些先前的元素会破坏所有进一步的迭代器引用...
切换到 std::map 以不断递增的计数器作为关键完全解决了问题