Coro в Perl 5.24

Темы:

В тот момент, когда перед выпуском Perl 5.24 остались считанные дни, в рассылке perl5-porters внезапно вспомнили, что в новом Perl по-прежнему остаётся сломанным модуль Coro Марка Леманна. Одна из проблем была связана с тем, что в Perl 5.22 структура MGVTBL (магическая виртуальная таблица), формирующаяся во время компиляции perl, стала константной. Coro делал переопределение в таблице, поэтому и не мог работать с новым Perl 5.22. Было предложено откатить это изменение до выхода Perl 5.24.

Вносить подобные изменения в последние дни перед выпуском слишком рискованно, поэтому произошёл спонтанный мозговой штурм проблемы, в результате которого удалось выяснить очень много интересных деталей. Оказалось, что переопределение MGVTBL требовалось Coro только для того, чтобы переопределить работу с хендлерами сигналов __DIE__ и __WARN__ для магического хеша %SIG, что в свою очередь было сделано из-за бага Perl, когда присутствует рассинхронизация в PL_warnhook и $SIG{__WARN__}. Теоретически оба должны ссылаться на хендлер обработки предупреждений, но некоторые кривые XS-программы, в том числе входящие в базовый Perl (например, find в PerlIO::Layer), могут изменить только PL_warnhook, забыв про $SIG{__WARN__}. То есть это был банальный костыль в Coro для обхода реальной проблемы в Perl. Эта проблема была зафиксирована в баге #125349,

Более того, оказалось, что Coro можно было приспособить для работы с константной MGVTBL, Dave Mitchell и Father Chrysostomos продемонстрировали патч, который позволяет Coro работать без проблем на Perl 5.22.

Очевидно, что если бы этот мозговой штурм прошёл год назад, проблема была бы решена раньше и не возникло бы таких явлений как stableperl. Вероятно штурм бы и не потребовался, если бы Марк сообщил о проблеме в Perl, когда столкнулся с ней впервые.

Комментарии

 

Код ошибки Winsock теперь попадает в $^E

Темы:

Давняя история борьбы Perl с кодами ошибок Winsock внезапно получила продолжение. Как известно, традиционно в Perl на Windows коды ошибок Winsock сохранялись в errno и транслировались в переменную $! так, чтобы соответствовать POSIX-кодам ошибок. Возникающие проблемы при таком подходе уже подробно освещались в статье «AnyEvent сломан на Strawberry Perl 5.20»

И вот, в конце февраля было внесено новое предложение по работе с ошибками Winsock. Чтобы немного смягчить имеющееся рассогласование, начиная с грядущего выпуска Perl 5.24 значение кода ошибки Winsock будет попадать в переменную $^E, которая как раз и служит для хранения платформо-специфичных ошибок. Отказ от модификации $! пока не предусматривается, но если он будет выполнен для Winsock, то пройдёт через стандартную схему устаревания и, как минимум, через один стабильный релиз.

11 марта это изменение было отправлено в основную ветку.

Комментарии