Я пишу аддон NodeJS, в котором я использую библиотеку C, которая позволяет регистрировать обратный вызов при определенных событиях. Когда вызывается обратный вызов, я хочу вызвать функцию обратного вызова NodeJS. Проблема в том, что в моей функции обратного вызова C я получаю ошибку сегментации при попытке сделать что-либо связанное с V8, например, создание HandleScope.
В test.js:
...
myaddon.register(function(data) {
console.log("data: " + JSON.stringify(data));
});
...
В test.c:
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include <node.h>
#include <v8.h>
using namespace v8;
void WINAPI myEvent(int num, void * context) {
HandleScope scope; // Segmentation fault here!
Local<Function> * cb = (Local<Function>*)(context);
Local<Object> obj = Object::New();
obj->Set(String::NewSymbol("id"), Number::New(num));
const int argc = 1;
Local<Value> argv[argc] = { obj };
(*cb)->Call(Context::GetCurrent()->Global(), argc, argv);
sleep(1);
}
Handle<Value> RegisterEvent(const Arguments& args) {
HandleScope scope;
Local<Function> cb = Local<Function>::Cast(args[0]);
int callbackId = registerEvent((Event)&myEvent, &cb );
printf("callback id: %i\n", callbackId);
init();
return scope.Close(Integer::New(callbackId));
}
void init(Handle<Object> exports) {
exports->Set(String::NewSymbol("register"),
FunctionTemplate::New(RegisterEvent)->GetFunction());
}
NODE_MODULE(test, init)
РЕДАКТИРОВАТЬ: Обновлено с реальным кодом.
РЕДАКТИРОВАТЬ: я только что изменил название этой проблемы, поскольку проблема, вероятно, в том, что моя функция обратного вызова не может получить доступ к контексту V8. Поскольку при создании экземпляра HandleScope возникает ошибка сегментации, я не вижу, что еще это может быть. В дополнение к этому вопросу я пытаюсь найти ответ в документации к V8, но он огромен, и у меня не так много времени для тестирования и расследования.
Ваша функция обработчика myEvent()
должен быть вызван в потоке V8. Если нет, вы должны опубликовать уведомление о событии в ветке V8:
https://stackoverflow.com/a/15701160/1355844
https://stackoverflow.com/a/22946062/1355844
Похоже, что вы могли забыть создать HandleScope
для вашей переменной. Это должно работать для вас.
void callbackFunc() {
HandleScope scope;
Local<Object> obj = Object::New();
}