ROS Newsletter49

Материал из Русский WINE
Перейти к: навигация, поиск

Выпуск новостей ReactOS №49

Настройки сети

Йоханнес Эндерволд (Johannes Anderwald) исправил упорную ошибку в настройках сети, возникшую после того, как он переписал диалог конфигурации сети в библиотеке netcfgx.dll с использованием COM-интерфейсов. Йоханнесу также пришлось реализовывать COM-интерфейсы, которых раньше не было, теперь они в netshell.dll. К сожалению, складывается впечатление, что клиент DHCP хранил настройки в неверном ключе реестра, в результате чего не работало получение информации из DNS и завершались с ошибкой приложения, которые полагались на эту информацию. Это, в сочетании с ошибками в библиотеке iphlpapi и новом коде, задержало релиз, поскольку мы не могли выпустить релиз без работающих сетевых служб.

Планировщик задач

Стефан Гинсберг (Stefan Ginsberg) столкнулся с несколькими ошибками планировщика задач в ядре и пытался исправить их. После обсуждения с другими разработчиками проблема была решена. Одной из наиболее серьезных проблем было то, что при изменении системного времени изменения делались в неправильном порядке и могли привести к состоянию гонки или зацикливанию системы. Другая, менее серьезная проблема была связана с таймером, не срабатывающим на заданных условиях при изменении системного времени.

PSEH (псевдо-SEH, структурная обработка исключений) 2.0

По словам KJK::Hyperion, "PSEH 2.0 это ужасный, работающий только с компилятором GCC и только на платформе x86 хак... В целом он, должно быть, побил мировой рекорд по надругательству над компилятором". Даже оставаясь настоящим хаком, он является огромным шагом вперёд, по сравнению с версией 1.1, которая использовала setjmp, фиктивные циклы и все невообразимые виды оптимизаций для обеспечения видимости поддержки SEH.

Настоящая SEH скрывает тот факт, что некоторые её элементы являются функциями, вложенными в другие функции, благодаря чему они похожи на любой другой блок кода. Это важно потому, что этим подфункциям необходимы общие с внешней функцией переменные для обработки исключений. Один из способов достижения этого - через вышеупомянутое скрытие, в результате чего SEH позволяет нескольким функциям использовать один стек, чего стандарт языка C технически не поддерживает.

PSEH версии 1.1 не делала этого, что требовало применения весьма неприятного обходного метода. По сути, вам требовалось объявлять все общие переменные в локальной структуре основной функции, а PSEH должна была передавать указатель на эту структуру подфункциям, которым может понадобиться обработка исключений. Несмотря на то, что версия 2.0 всё ещё технически не реализует скрытие функции, она достигает той же функциональности, воспользовавшись преимуществами нестандартных особенностей GCC и избавляет от необходимости определения структуры с общими переменными. Сам GCC, по сути, делает это в любом случае, так что это только вопрос получения указателя на структуру. Это выполнимо, но в результате мы получаем весьма уродливый код. Однако то, что делает PSEH 2.0, на 99% синтаксически идентично использованию реальной SEH. Что касается того, чем была версия 1.1, скажем, что её лучше забыть.

Что касается внедрения PSEH для ARM и x64, KJK говорит, что это выполнимо, но потребует много работы.

MSVC (Microsoft Visual C)

Тот, кто знает KJK, поймёт, что что-то заставило его заняться PSEH 2.0. И жалоб на версию 1.1 для этого было бы недостаточно, поскольку половина из них были жалобы самого KJK. Правда в том, что KJK фактически начал работать над возможностью компиляции ReactOS с использованием C/C++ компилятора от Microsoft. Использование MSVC позволит исключить необходимость в PSEH (при использовании этого компилятора) и разрешить использование подлинного SEH, что является одной из причин для того, чтобы сделать синтаксис PSEH ближе к SEH. В противном случае стало бы гораздо труднее поддерживать транк в компилируемом виде и для GCC, и для MSVC.

Заголовочные файлы, используемые в настоящее время, имеют ряд недостатков, одним из которых является использование директивы #pragma system_header - особенности GCC, которая скрывает все предупреждения для файлов, использующих этот заголовок. Первоначально она была предназначена для сокрытия предупреждений, которые возникали из-за использования нестандартных возможностей, необходимых Windows API, но в конечном итоге это привело к сокрытию всех предупреждений. Вы можете себе представить, к какой небрежности это может приводить - например, неправильные или дублированые определения и другие существенные проблемы не будут обнаружены. Стефан тщательно исследует каждый заголовок с этой директивой и удаляет её, а затем пытается разрешать последствия изменений. Весьма возможно, директивы не присутствуют в самом ядре. Одна из наиболее распространенных ошибок, с которой приходится работать Стефану - это переобъявления многих констант и макросов, которые определяются в нескольких местах. Это порождает столько предупреждений и ошибок компилятора, что их вывод переполняет окно среды сборки, поэтому Стефану приходится смотреть в журнал компиляции, чтобы узнать, где происходят ошибки.

Наряду с очисткой самих заголовочных файлов, Стефан разделяет их на DDK и PSDK, исправляя смешанные заголовки, содержащие компоненты режима ядра и пользовательского режима, а также перекрестные включения обоих. Как только это будет сделано, станет возможным создать отдельные PSDK и DDK.

Newsletters
30-39 #30#31#32#33#34#35#36#37#38#39
40-49 #40#41#42#43#44#45#46#47#48#49
50-59 #50#51#52#53#54#55#56#57#58#59
60-69 #60#61#62#63#64#65#66#67#68#69
70-79 #70#71#72#73#74#75#76#77#78#79
80-89 #80#81#82#83#84#85#86#87#88#89
90-99 #90#91#92#93#94#95#96#97#98#99