Por que o V8 não é executado com encadeamentos SDL?

9

Consegui compilar e vincular o V8 ao meu jogo e a interpretação de código funciona bem. No entanto, quero dividir meu código e o loop do jogo deve existir em um thread e o mecanismo de script deve ser executado em um segundo thread ao lado do loop do jogo. Estou usando SDL e, portanto, tentei esse código para gerar um novo thread

SDL_CreateThread(ScriptingEngine::SpawnMain, NULL);

onde o código a seguir é meu mecanismo de script de teste:

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

No entanto eu recebo um erro como Access violation reading location 0x00000000.na api.cclinha 716: i::Isolate* isolate = env->GetIsolate();.

Alguém tem uma idéia de como posso corrigir isso ou qual é o problema exato?

Christian Ivicevic
fonte
+1 por voltar com a resposta. Você realmente deve responder sua própria pergunta para marcá-la como respondida (a equipe de S / O encoraja a responder suas próprias perguntas, se puder).
11136 Jonathan Dickinson
@ JonathanDickinson: Não tenho reputação suficiente e, portanto, estou bloqueado por 8 horas até conseguir responder à minha própria pergunta. Vou fazer isso amanhã ;-)
Christian Ivicevic

Respostas:

6

Solução

A solução foi usar um monitor como v8::Locker locker;. Exatamente essa linha deve ser inserida na linha antes da criação do HandleScopee deve funcionar, embora meu código lá em cima seja uma porcaria. Eu combinei todas as variáveis ​​etc. em um método sem um setupmétodo ou as variáveis ScriptingEngine.

Para encurtar a história: o Lockerobjeto é responsável pelo gerenciamento do encadeamento, pois o mecanismo se isola para fins de sandbox.

Christian Ivicevic
fonte
Às vezes, essa coisa de representante de SO é boba para usuários decentes :).
Jonathan Dickinson