EXC_BAD_ACCESS: при вызове Nan :: Callback - PullRequest
0 голосов
/ 12 февраля 2019

Я пишу аддон Node.js c ++, который требует частых обратных вызовов из C ++ в Javascript.

Для конструктора требуются две функции: успех и обратный вызов ошибки.

...
// assuming info[0] and info[1] are functions with ->IsFunction()
MyClass* myClass = new MyClass();
myClass->Wrap(info.Holder());
myClass->onStateUpdateCallback = new Nan::Callback(info[0].As<v8::Function>());
myClass->onErrorCallback = new Nan::Callback(info[1].As<v8::Function>());
...

onStateUpdateCallback и onErrorCallback являются частными свойствами класса MyClass, определенного следующим образом:

...
Nan::Callback* onStateUpdateCallback;
Nan::Callback* onErrorCallback;
...

Теперь, когда я вызываю onStateUpdateCallback из другой функции, она работает в первый раз, но завершается с ошибкой во второй раз,throwing EXC_BAD_ACCESS (при отладке с помощью lldb).

Вот как я вызываю обратный вызов ( Примечание: функция вызывается из внешней библиотеки, которая выполняет вызовы в разных потоках в первый разв основном потоке, второй раз в потоке # 13, который может вызвать проблему! ):

...
const int argc = 4;
// The arguments should be numbers and strings, but I simplified it to null...
v8::Local<v8::Value> argv[argc] = {
    Nan::Null(),
    Nan::Null(),
    Nan::Null(),
    Nan::Null()
};
onStateUpdateCallback->Call(argc, argv);
...

Я предполагаю, что функция или область видимости были собраны мусором Javascript, но яПонятия не имею, как предотвратить такое поведение, есть идеи?

Спасибо.

1 Ответ

0 голосов
/ 15 февраля 2019

Как я и думал, возникла проблема с разными потоками.

Я исправил проблему с использованием Nan::AsyncProgressWorker.

...