- 1
- 2
- 3
- 4
- 5
if (errno==EINTR) while (errno==EINTR)
{
fseek(fr,loffset,SEEK_SET);
fgets(line_buffer,len,fr);
}
Нашли или выдавили из себя код, который нельзя назвать нормальным, на который без улыбки не взглянешь? Не торопитесь его удалять или рефакторить, — запостите его на говнокод.ру, посмеёмся вместе!
+139.3
if (errno==EINTR) while (errno==EINTR)
{
fseek(fr,loffset,SEEK_SET);
fgets(line_buffer,len,fr);
}
sacc - система биллинга для squid
Одной проверки на ошибку - видимо, недостаточно
Вообще вы меня удивляете, у gcc достаточно серьёзные алгоритмы оптимизации и было бы странно, если бы gcc не замечал двойной проверки на "(errno==EINTR)".
Вообще то я не понимаю разговоров по поводу gcc.. да естественно компилятор не идиот - и оптимизирует как надо, вопрос в другом - как можно было такое вообще написать.. И так же понятно, что можно просто обойтись while в данном случае - первая проверка инварианта цикла даст требуемое поведение.
errno у нас статическая глобальная переменная устанавливающаяся во время ошибки системных вызовов, и вызов fgets() внутри цикла каждый раз ее устанавливает заново. Смысл кода в том чтобы пытаться выполнить пока не пройдет без прерывание эта операция. Так как fgets() использует системные вызовы, если возниктет прерывание, мы получим errno==EINTR опять, и вынуждены будем повторить чтение с данного места файла.
Я бы даже сказал что это код с повышенной надежностью... но чего-то слегка не хватает, наверное проверки результата fgets() на EOF...
сорьк
фсе понял... посыпаю голову пеплом...
я чет подумал что наезды по поводу того шо while лишний...
а там if ненадо, ой ненадо
аааааа! был невнимателен....