Не удается получить доступ к контексту V8 в & quot; обратном вызове & quot; функция

Я пишу аддон 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, но он огромен, и у меня не так много времени для тестирования и расследования.

1

Решение

Ваша функция обработчика myEvent() должен быть вызван в потоке V8. Если нет, вы должны опубликовать уведомление о событии в ветке V8:

https://stackoverflow.com/a/15701160/1355844

https://stackoverflow.com/a/22946062/1355844

1

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

Похоже, что вы могли забыть создать HandleScope для вашей переменной. Это должно работать для вас.

void callbackFunc() {
HandleScope scope;
Local<Object> obj = Object::New();
}
0

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector