Как я могу прикрепить обработчик событий к выходу процесса в собственном модуле Node.js?

Я работаю над реализацией правильного управления памятью для собственного модуля Node.js. Я столкнулся с проблемой, описанной в этом вопросе:
Родной аддон node.js — деструктор упакованного класса не запускается

Предлагаемое решение — связать деструкторы нативных объектов с process.on('exit')Однако ответ не содержит, как это сделать в собственном модуле.

Я также кратко рассмотрел документы по libuv, но они также не содержали ничего полезного в этом отношении.

ПРИМЕЧАНИЕ: я не особенно заинтересован в получении process объект, но я попробовал это так:

auto globalObj = NanGetCurrentContext()->Global();
auto processObj = ::v8::Handle<::v8::Object>::Cast(globalObj->Get(NanNew<String>("process")));
auto processOnFunc = ::v8::Handle<::v8::Function>::Cast(processObj->Get(NanNew<String>("on")));
Handle<Value> processOnExitArgv[2] = { NanNew<String>("exit"), NanNew<FunctionTemplate>(onProcessExit)->GetFunction() };
processOnFunc->Call(processObj, 2, processOnExitArgv);

Проблема в том, что я получаю это сообщение при попытке удалить мой объект:

Assertion `persistent().IsNearDeath()' failed.

Я также пытался использовать std::atexit и получил ту же ошибку утверждения.

Пока что лучшее, что я мог сделать, это собрать ObjectWrap случаи в std::set и очистка обернутых объектов, но из-за вышеуказанной ошибки я не смог очистить сами обертки.

Итак, как я могу сделать это правильно?

1

Решение

Я также получал "Assertion persistent().IsNearDeath()' failed" сообщение.

Eсть node::AtExit() функция, которая запускается непосредственно перед выключением Node.js — эквивалент process.on('exit'),

Передать функцию обратного вызова node::AtExit из функции инициализации вашего дополнения (или там, где это уместно).

Функция документирована здесь:
https://nodejs.org/api/addons.html#addons_atexit_hooks

Например:

NAN_MODULE_INIT(my_exports)
{
// other exported stuff here
node::AtExit(my_cleanup);
}

NODE_MODULE(my_module, my_exports) //add-on exports

//call C++ dtors:
void my_cleanup()
{
delete my_object_ptr; //call object dtor, or other stuff that needs to be cleaned up here
}
1

Другие решения


По вопросам рекламы [email protected]