GIL, GTK threads e callbacks

Durante a implementação do suporte a BookViews no evolution-python, um dos sinais que deveriam ser “wrappados” (??) recebia uma GList, que (ainda) não é suportada automaticamente na geração de código do PyGTK. A solução encontrada foi criar um callback C padrão, que receberia como user_data uma tupla python com a função python e argumentos extras passados. O callback C então criaria novamente a função python e a chamaria com os argumentos do sinal e os extras.

Ontem, testando um código do Easy (projeto do INdT em parceria com a UFCG) que usava esse callback, me deparei com alguns segmentation faults, que ocorriam apenas quando também usava o Eagle.

O Eagle habilita threads usando gtk.gdk.threads_init(), de forma que o GIL é liberado no gtk.main(), sendo readquirido apenas quando handlers do PyGTK são chamados, de forma que as funções Python (a partir de C) possam ser chamadas. Para o programador python, esse processo é transparente, sendo executado internamente pelo PyGTK.

Acontece que meu callback era uma função C “manual”, sem intervenção do PyGTK, e eu havia esquecido que requisitar (e depois liberar) o GIL, através das macros de conveniência fornecidas pelo PyGTK: pyg_gil_state_ensure e pyg_gil_state_release. Assim, eu tentava executar código python sem ter o GIL, causando o segmentation fault. No caso, para corrigir, *_ensure vai logo no começo do callback, e *_release logo antes de retornar.

PS: Nova versão do appliance VMWare do Maemo, por Marcelo.


Deixe uma resposta

Preencha os seus dados abaixo ou clique em um ícone para log in:

Logotipo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair / Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair / Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair / Alterar )

Foto do Google+

Você está comentando utilizando sua conta Google+. Sair / Alterar )

Conectando a %s