¿Por qué V8 no se ejecuta con hilos SDL?

9

pude compilar y vincular V8 contra mi juego y la interpretación del código funciona bien. Sin embargo, quiero dividir mi código y el bucle del juego debería existir en un hilo y el motor de secuencias de comandos debería ejecutarse en un segundo hilo junto a mi bucle del juego. Estoy usando SDL y, por lo tanto, probé este código para generar un nuevo hilo

SDL_CreateThread(ScriptingEngine::SpawnMain, NULL);

donde el siguiente código es mi motor de secuencias de comandos de prueba:

namespace ScriptingEngine {
    v8::HandleScope handleScope;
    v8::Handle<v8::ObjectTemplate> global = v8::ObjectTemplate::New();
    v8::Persistent<v8::Context> context;

    void Setup() {
            // TODO: bind functions to global
            // ...
            context = v8::Context::New(NULL, global);
    }

    int SpawnMain(void *arguments) {
            v8::Context::Scope scope(context);
            v8::Handle<v8::Script> script = v8::Script::Compile(
                    v8::String::New("'Hello World'")
            );
            v8::Handle<v8::Value> result = script->Run();
            context.Dispose();
            return EXIT_SUCCESS;
    }
}

Sin embargo, me sale un error al igual que Access violation reading location 0x00000000.en la api.cclínea 716: i::Isolate* isolate = env->GetIsolate();.

¿Alguien tiene idea de cómo puedo solucionar esto o cuál es el problema exacto?

Christian Ivicevic
fuente
+1 por volver con la respuesta. Realmente deberías responder tu propia pregunta para poder marcarla como respondida (el equipo de S / O te anima a responder tus propias preguntas si puedes).
Jonathan Dickinson el
@ JonathanDickinson: No tengo suficiente reputación y, por lo tanto, estoy bloqueado durante 8 horas hasta que pueda responder mi propia pregunta. Haré esto mañana ;-)
Christian Ivicevic

Respuestas:

6

Solución

La solución fue utilizar un monitor como v8::Locker locker;. Exactamente esta línea debe ingresarse antes de la creación de la línea HandleScopey debería funcionar, aunque mi código allí es una mierda. He combinado todas las variables, etc. en un método sin un setupmétodo o las variables en ScriptingEngine.

Larga historia corta: el Lockerobjeto es responsable de la gestión de subprocesos ya que el motor se aísla para fines de sandboxing.

Christian Ivicevic
fuente
A veces, esto del representante SO es una tontería para usuarios decentes :).
Jonathan Dickinson el