Как Linux справляется с переполнением в мгновение ока?

Предположим, у нас есть следующий код:

if (timeout > jiffies)
{
    /* we did not time out, good ... */
}
else
{
    /* we timed out, error ...*
}

Этот код отлично работает, когда значение jiffies не переполняется. Однако, когда jiffies переполняются и сбрасываются до нуля, этот код не работает должным образом.

Linux, по-видимому, предоставляет макросы для решения этой проблемы переполнения

#define time_before(unknown, known) ((long)(unkown) - (long)(known) < 0)

, и код выше должен быть защищен от переполнения при замене этим макросом:

// SAFE AGAINST OVERFLOW
if (time_before(jiffies, timeout)
{
    /* we did not time out, good ... */
}
else
{
    /* we timed out, error ...*
}    

Но каково обоснование time_before (и других макросов time_?

​​time_before (jiffies, timeout) будет расширен до

((long)(jiffies) - (long)(timeout) < 0)

Как этот код предотвращает проблемы с переполнением?

5
задан SHH 21 November 2011 в 03:31
поделиться