Евгений Музыченко

Previous Entry Share Next Entry
Качество программного кода
emuzychenko
Работая со своим кодом, начатым лет 15 назад и периодически переделываемым, регулярно огорчаюсь "грязным" решениям, вроде применения двух объектов синхронизации там, где можно было бы обойтись одним. Но периодически попадается код, на фоне которого самый грязный мой выглядит чуть ли не эталоном аккуратности и изящества. :)

Год назад приспичило мне портировать драйвер SiLabs для их микросхем CP2101-2104 с WinCE5.0 под 4.2 (Pocket PC 2003). Списался с ними, попросил исходники, они их прислали. Скомпилировалось легко, а вот работало только в отладочной конфигурации, со включенными отладочными сообщениями, и то не всегда. Понятное дело - ошибки синхронизации. Полез копать код - а он не просто ужасен, а ужасен-ужасен. Синхронизация сделана с помощью десятка событий, которые в сложной последовательности сбрасываются и устанавливаются, причем в ряде мест это очень подозрительно в плане гонок. Все пронизано принудительным преобразованием типов указателей - даже там, где легко можно было бы обойтись без этого, отдав компилятору контроль за соответствием.

Ну и прелести вроде безусловного захвата критической секции с последующим условным освобождением в нескольких местах, где делается преждевременный выход. Формально написано без goto, а фактически - оно самое. Или условный захват и безусловное освобождение.

В итоге после нескольких дней активного допиливания и устранения наиболее кривых мест оно по-прежнему отказывается работать стабильно, хотя виснуть стало реже. В каждом случае комбинация взаимной блокировки или вечного ожидания получается новая - при таком количестве объектов синхронизации оно и неудивительно. Интересно, насколько у меня еще хватит терпения. :)

А сейчас оказалось, что это ни разу не их собственный код - прототипом послужил драйвер MDD из дистрибутива WinCE. В нем такая же жуткая грязь, даже удивительно, как это может работать стабильно...

?

Log in

No account? Create an account