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