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

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


person Andreas Selenwall    schedule 20.01.2015    source источник
comment
Если вы программируете расширение для node.js, значит, вы программируете на C++, а не на C.   -  person Some programmer dude    schedule 20.01.2015
comment
Да, ну да... это правда. Ничего не делал ни на C++, ни на C уже несколько лет. Спасибо!   -  person Andreas Selenwall    schedule 20.01.2015


Ответы (2)


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

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

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

person pmed    schedule 23.01.2015
comment
Ваш ответ вместе с этим сообщением: stackoverflow.com/questions/13826803/ решил мою проблему. Теперь он отлично работает. Спасибо. - person Andreas Selenwall; 26.01.2015

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

void callbackFunc() {
  HandleScope scope;
  Local<Object> obj = Object::New();
}
person E_net4 the curator    schedule 20.01.2015
comment
Пытался добавить HandleScope в начале моей функции обратного вызова, и теперь вместо этого я получаю SegmentationFault в HandleScope. Итак, я думаю, что мы приближаемся :) Может быть, это связано с V8, поскольку обратный вызов выполняется всякий раз, когда в зависимости от того, когда библиотека C (сторонняя сторона) получает событие, я должен полагаться только на функции V8 или может быть, что V8 по какой-то причине не объявлен в этой области? - person Andreas Selenwall; 20.01.2015