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
This is a translation of the MySQL Reference Manual that can be found at dev.mysql.com. The original Reference Manual is in English, and this translation is not necessarily as up to date as the English version.