Я пытаюсь вызвать зарегистрированную функцию JS, когда вызывается обратный вызов С++, но я получаю segfault из-за того, что, как я полагаю, является проблемой области видимости.
Handle<Value> addEventListener( const Arguments& args ) {
HandleScope scope;
if (!args[0]->IsFunction()) {
return ThrowException(Exception::TypeError(String::New("Wrong arguments")));
}
Persistent<Function> fn = Persistent<Function>::New(Handle<Function>::Cast(args[0]));
Local<Number> num = Number::New(registerListener(&callback, &fn));
scope.Close(num);
}
Когда происходит событие, вызывается следующий метод. Я предполагаю, что это, вероятно, происходит в другом потоке, в котором V8 выполняет JS.
void callback(int event, void* context ) {
HandleScope scope;
Local<Value> args[] = { Local<Value>::New(Number::New(event)) };
Persistent<Function> *func = static_cast<Persistent<Function> *>(context);
(* func)->Call((* func), 1, args);
scope.Close(Undefined());
}
Это вызывает ошибку сегментации: 11. Обратите внимание, что если я вызываю функцию обратного вызова напрямую со ссылкой на Persistent из addEventListener(), она выполняет функцию правильно.
Я предполагаю, что мне нужен шкафчик или изолятор? Также похоже, что uv_queue_work() libuv может решить эту проблему, но, поскольку я не запускаю поток, я не вижу, как вы будете его использовать.