Предположим, у нас есть следующий код:
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)
Как этот код предотвращает проблемы с переполнением?