LINUX.ORG.RU

Дельта времени в struct timeval: tv_usec < 0, декларирована ли обработка такого случая?

 


0

1

День добрый.

Один программист вычисляя дельту времени в структуре struct timeval, не позаботился о переносе и правильной обработке знаков в полях этой структуры. Понятное дело, схалтурил и был ...

Вопрос вот в чем, декларируется ли где-нибуть как обрабатывать ситуацию tv_usec < 0.

Например 1. tv.tv_sec = 1; tv.tv_usec = -1;

Например 2. tv.tv_sec = -2; tv.tv_usec = -2;


Чёткого описания касательно отрицательного tv.tv_usec не встречал.

В макросах timeradd и timersub (с помощью которых нужно складывать и вычиатать timeval) подразумевается, что они на вход получают нормализированное значение ( 0<=tv.tv_usec<=99999). На выход они тоже дают нормализированное timeval.

В описании setitimer() написано, что ядро должно возвращать EINVAL, если tv.tv_usec не нормализованное, хотя гуглится патч, который вместо EINVAL делал нормализацию.

mky ★★★★★
()
Ответ на: комментарий от mky

Спасибо за подсказку!

Тоже нагуглил в описании setitimer: «POSIX.1-2001 says that setitimer() should fail if a tv_usec value is specified that is outside of the range 0 to 999999. However, in kernels up to and including 2.6.21, Linux does not give an error, but instead silently adjusts the corresponding seconds value for the timer. From kernel 2.6.22 onward, this nonconformance has been repaired: an improper tv_usec value results in an EINVAL error»

Получается, в каждом отдельном случае, придется посупать в зависимости от ситуации.

Спаисбо!

Vic
() автор топика
Ответ на: комментарий от Vic

Для функции adjtime(), судя по ее исходному коду, отрицательная дельта это когда itv->tv_sec < 0 и itv->tv_usec < 0 = пример 2.

Иначе не правильно рассчитает дельту (tntx.offset).

LINKAGE int
ADJTIME (const struct TIMEVAL *itv, struct TIMEVAL *otv)
{
    struct TIMEX tntx; // tntx.offset is long int

    if (itv)
    {
        struct TIMEVAL tmp;
        ........
        tntx.offset = tmp.tv_usec + tmp.tv_sec * 1000000L;
        ........
    }
    return 0;
}

Действительно, в каждом отдельном случае в зависимости от ситуации.

Vic
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.