Многопоточность в sbcl для dragonfly не пофиксил и уже в принципе сдался. Всем пофиг, к тому же.
Ситуация такая, что в многопоточной сборке sbcl падает по SIGILL (Illegal Instruction), если система нагружена чем-то ещё. В sb-qshow или ktrace нет никаких закономерностей, падает всегда по разному. Наверное, где-то race condition. Код, касемый мьютексов, вроде нормальный, значит, может дело в сигналах.
Спрошу на всякий случай:
В sbcl internals как-то размыто говорится, что есть blockable signals и semi-synchronous signals. Как работают последние? (кстати, SIGILL у них именно semi-synchronous). Ещё написано, что SIG_STOP_FOR_GC у них blockable, но не deferrable. Как я понимаю, при вызове sigaction у них стоит для SIG_STOP_FOR_GC флаг SA_NODEFER, а потом они блокируют его с помощью pthread_sigmask. Так почему он не deferrable? Видел, что где-то в src/runtime/interrupts.c есть обработчик для SIGILL (это interrupt_handle_now_handler). Какой процесс должен его вызывать и почему он так и остается не вызванным?
И ещё, что-то не пойму в чём разница между without-interrups и pseudo atomic sections. Где что применяется?
И да, кто может придумать какие-нибудь тесты, которые помогут отловить ошибку? Например, как-нибудь отключить GC, чтобы посмотреть, будет ли ошибка без него или уйдет, итд...
mv, поможешь советом?