Я пишу надстройку NodeJS, в которой использую библиотеку C, которая позволяет регистрировать обратный вызов при определенных событиях. Когда обратный вызов запущен, я хочу вызвать функцию обратного вызова NodeJS. Проблема в том, что в моей функции обратного вызова C я получаю ошибку сегментации при попытке сделать что-либо, связанное с V8, например, создать HandleScope.
В test.js:
...
myaddon.register(function(data) {
console.log("data: " + JSON.stringify(data));
});
...
В тесте.с:
#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, но она огромна, и у меня не так много времени для тестирования и изучения.