Pourquoi V8 ne fonctionne-t-il pas avec les threads SDL?

9

j'ai pu compiler et lier la V8 à mon jeu et l'interprétation du code fonctionne bien. Cependant, je veux diviser mon code et la boucle de jeu devrait exister dans un thread et le moteur de script devrait fonctionner dans un deuxième thread à côté de ma boucle de jeu. J'utilise SDL et j'ai donc essayé ce code pour générer un nouveau thread

SDL_CreateThread(ScriptingEngine::SpawnMain, NULL);

où le code suivant est mon moteur de script de test:

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;
    }
}

Cependant , je reçois une erreur comme Access violation reading location 0x00000000.dans la api.ccligne 716: i::Isolate* isolate = env->GetIsolate();.

Quelqu'un at-il une idée de la façon dont je peux résoudre ce problème ou quel est le problème exact?

Christian Ivicevic
la source
+1 pour revenir avec la réponse. Vous devez vraiment répondre à votre propre question afin de pouvoir la marquer comme ayant été répondue (l'équipe S / O encourage à répondre à vos propres questions si vous le pouvez).
Jonathan Dickinson
@JonathanDickinson: Je n'ai pas assez de réputation et je suis donc bloqué pendant 8 heures jusqu'à ce que je puisse répondre à ma propre question. Je le ferai demain ;-)
Christian Ivicevic

Réponses:

6

Solution

La solution était d'utiliser un moniteur comme v8::Locker locker;. Exactement, cette ligne doit être entrée dans la ligne avant la création de la HandleScopeet cela devrait fonctionner, bien que mon code là-haut soit de la merde. J'ai combiné toutes les variables, etc. en une seule méthode, sans setupméthode ni variables ScriptingEngine.

Pour faire court: l' Lockerobjet est responsable de la gestion des threads car le moteur s'isole à des fins de sandboxing.

Christian Ivicevic
la source
Parfois, ce truc de représentant SO est idiot pour les utilisateurs décents :).
Jonathan Dickinson