Sto provando a chiamare una funzione JS registrata quando viene chiamato un callback C++, ma sto ottenendo un segfault per quello che presumo sia un problema di scoping.Chiamare la funzione Javascript da un callback C++ in V8
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);
}
Quando si verifica un evento, viene chiamato il seguente metodo. Presumo che ciò avvenga probabilmente su un altro thread a cui V8 sta eseguendo 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());
}
Questo provoca un errore di segmentazione: 11. Si noti che se chiamo la funzione di richiamata direttamente con un riferimento persistente da addEventListener(), esegue la funzione correttamente.
Suppongo che io abbia bisogno di un armadietto o di un isolamento? Sembra anche che uv_queue_work() di libuv sia in grado di risolverlo, ma poiché non avvio il thread, non riesco a vedere come lo useresti.
Grazie, questo semplifica il codice e corregge il problema dell'ambito, ma speravo in alcune informazioni come su come richiamare il thread principale dal thread di callback. Ho ottenuto questo risultato utilizzando la funzione eio_nop() dalla libreria EIO, ma il modo preferito è usare libuv. Il mio problema è che non sembra esserci un equivoco di libua di eio_nop. – marchaos
@marchaos Ok. Non ero del tutto chiaro cosa stavi cercando sul lato del threading. A quanto ho capito, quello che stai cercando è in grado di eseguire JS dal callback nel contesto del thread principale v8. Ho messo insieme una piccola demo su come farlo con isolates/lockers (https://gist.github.com/4341994). Nota che questo significa che devi regolare ovunque usi V8 per bloccare l'isolato prima di fare qualsiasi altra cosa! – je4d
Grazie. Darà questo, ma sembra l'approccio giusto. – marchaos