SBCL-1.0.42
Sep. 25th, 2010 03:31 pmСобрал виндовый инсталлятор SBCL 1.0.42 (раньше использовал 1.0.40) с поддержкой нитей.
https://sites.google.com/site/dmitryvksite/sbcl-distr/sbcl-1.0.42-threads.msiСобрал виндовый инсталлятор SBCL 1.0.42 (раньше использовал 1.0.40) с поддержкой нитей.
https://sites.google.com/site/dmitryvksite/sbcl-distr/sbcl-1.0.42-threads.msi
no subject
Date: 2010-10-07 01:59 pm (UTC)Так что похоже, что код ошибки затирает аллоцирующая часть GC.
no subject
Date: 2010-10-07 02:19 pm (UTC)no subject
Date: 2010-10-07 05:01 pm (UTC)Спасибо (обоим) за находку - вероятно, в каком-то месте не сохраняется WSAGetLastError (кстати, а на винде errno и WSAGetLastError отличаются?), что и приводит к наблюдаемому эффекту.
>Не особо понимаю, почему правильным поведением является возвращать NIL, даже и при EINTR | EAGAIN (я бы condition выбросил),
Сигнал - это вполне нормально, и делать из этого событие (хм, игра слов получается :) ) не стоит; еще возврат EAGAIN/EWOULDBLOCK возможен при неблокирующем вводе-выводе. Есть два логичных варианта - либо вернуть NIL, либо перезапустить accept (но при неблокирующем вводе-выводе делать этого не стоит, т.к. следующий вызов закончится тем же).
no subject
Date: 2010-10-08 02:43 am (UTC)GetLastError() и WSAGetLastError() не отличаются. Портятся от каждого чиха: сделали VirtualAlloc() — и получили там 0 (SUCCESS), сделали WaitForSingleObject — опять же получили 0.
no subject
Date: 2010-10-08 06:13 pm (UTC)no subject
Date: 2010-10-08 07:55 pm (UTC)http://msdn.microsoft.com/en-us/library/ms737828%28VS.85%29.aspx
no subject
Date: 2010-10-08 08:14 am (UTC)Тред внезапно перестаёт реагировать на прерывания. Обычный slime-repl thread, не внутри какого-либо цикла, не после каких-либо очевидных специфических действий... При прерывании в нём ставится *INTERRUPT-PENDING*, и нифига не обрабатывается. Если запустить новый тред, там всё нормально. Не подскажете, куда смотреть для диагностики? (*interrupts-enabled* t, *allow-with-interrupts* t)
2. По поводу неуместности condition для ewouldblock/eagain: в общем-то, в качестве локального performance trick решение оправдано, но с точки зрения чистоты интерфейса лучше всё-таки condition выбрасывать — а уж caller пусть решает, что делать. Функции из sb-unix и sb-posix таки выбрасывают, никого это не беспокоит (?).
Хотя я обнаружил, что в sb-bsd-sockets вроде как принято возвращать NIL для EAGAIN/EWOULDBLOCK, например, на socket-receive тоже так делается. Если это не нововведение, то трогать не стоит, конечно.
Тем более что socket-errno не является частью публичного API, и ответить на вопрос
no subject
Date: 2010-10-08 06:11 pm (UTC)Вообще я обработку прерываний не очень подробно пока тестировал (я отношусь к этому как к вспомогательной функции, и для меня сейчас важнее довести все до смерживаемого состояния, а то боюсь, что пропадет мотивация); знаю, что с прерываниями есть проблемы. В threads.impure были подобные проблемы - прерывание не доходило - там это "лечилось" вставкой выражений (let ((x nil)) x) в определенные места кода (но обычно до того места, где прерывания переставали работать; поэтому мне кажется, что неправильно работает функция gc_safepoint и все-таки что-то пропускает).
no subject
Date: 2010-10-08 06:12 pm (UTC)