XOOPS Brasil

 

E.5. Comentários Sobre Threads RTS

Tentamos usar os pacotes RTS thread com o MySQL mas nos deparamos com o seguinte problema:

Eles usam um versão antiga de diversas chamadas POSIX e é muito tedioso fazer ``wrappers'' para todas as funções. Estamos inclinados a pensar que seria mais fácil alterar a biblioteca de threads para a especificação POSIX mais nova.

Alguns ``wrappers'' já estão escritos. Veja mysys/my_pthread.c para maiores informações.

Pelo menos o seguinte deve ser mudado:

pthread_get_specific deve usar um argumento. sigwait deve usar dois argumentos. Diversas funções (pelo menos pthread_cond_wait, pthread_cond_timedwait) deve retornar o código do erro. Agora eles retornam -1 e configuram errno.

Outro problema é que threads a nivel do usuario usam o sinal ALRM e isto aborta diversas das funções (read, write, open...). O MySQL deve fazer uma nova tentativa de interrupção em todos mas não é facil de se verifica isto.

O maior problema não solucionado é o seguinte:

Para conseguir alarmes de threads alteramos mysys/thr_alarm.c para esperar entre alarmes com pthread_cond_timedwait(), mas isto aborta com o erro EINTR. Tentamos depurar a biblioteca thread para descobrirmos porque isto acontece, mas não podemos encontrar nenhuma solução fácil.

Se alguém quiser experimentar o MySQL com RTS threads sugerimos o seguinte:

  • Altere as funções que o MySQL usa da biblioteca de threads para POSIX. Isto não deve levar tanto tempo.

  • Compile todas as bibliotecas com -DHAVE_rts_threads.

  • Compile thr_alarm.

  • Se houver alguma pequena diferença na implementação, elas devem ser corrigidas alterando my_pthread.h e my_pthread.c.

  • Execute thr_alarm. Se ele executar sem mensagens de ``aviso'', ``erro'' ou aborto, você está na trilha certa. Aqui está uma execução bem sucedidad no Solaris:

    Main thread: 1
    Thread 0 (5) started
    Thread: 5 Waiting
    process_alarm
    Thread 1 (6) started
    Thread: 6 Waiting
    process_alarm
    process_alarm
    thread_alarm
    Thread: 6 Slept for 1 (1) sec
    Thread: 6 Waiting
    process_alarm
    process_alarm
    thread_alarm
    Thread: 6 Slept for 2 (2) sec
    Thread: 6 Simulation of no alarm needed
    Thread: 6 Slept for 0 (3) sec
    Thread: 6 Waiting
    process_alarm
    process_alarm
    thread_alarm
    Thread: 6 Slept for 4 (4) sec
    Thread: 6 Waiting
    process_alarm
    thread_alarm
    Thread: 5 Slept for 10 (10) sec
    Thread: 5 Waiting
    process_alarm
    process_alarm
    thread_alarm
    Thread: 6 Slept for 5 (5) sec
    Thread: 6 Waiting
    process_alarm
    process_alarm
    ...
    thread_alarm
    Thread: 5 Slept for 0 (1) sec
    end