mirror of git://sourceware.org/git/glibc.git
Sync timespec-{add,sub} with gnulib
It sync with gnulib commit 06011ed74e978613422aca43c0bd92dc44213933. Reviewed-by: Paul Eggert <eggert@cs.ucla.edu>
This commit is contained in:
parent
356ced8dcb
commit
c1dac8f83e
|
@ -33,36 +33,30 @@ timespec_add (struct timespec a, struct timespec b)
|
||||||
int ns = a.tv_nsec + b.tv_nsec;
|
int ns = a.tv_nsec + b.tv_nsec;
|
||||||
int nsd = ns - TIMESPEC_HZ;
|
int nsd = ns - TIMESPEC_HZ;
|
||||||
int rns = ns;
|
int rns = ns;
|
||||||
time_t tmin = TYPE_MINIMUM (time_t);
|
|
||||||
time_t tmax = TYPE_MAXIMUM (time_t);
|
|
||||||
|
|
||||||
if (0 <= nsd)
|
if (0 <= nsd)
|
||||||
{
|
{
|
||||||
rns = nsd;
|
rns = nsd;
|
||||||
if (bs < tmax)
|
time_t bs1;
|
||||||
bs++;
|
if (!INT_ADD_WRAPV (bs, 1, &bs1))
|
||||||
|
bs = bs1;
|
||||||
else if (rs < 0)
|
else if (rs < 0)
|
||||||
rs++;
|
rs++;
|
||||||
else
|
else
|
||||||
goto high_overflow;
|
goto high_overflow;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* INT_ADD_WRAPV is not appropriate since time_t might be unsigned.
|
if (INT_ADD_WRAPV (rs, bs, &rs))
|
||||||
In theory time_t might be narrower than int, so plain
|
|
||||||
INT_ADD_OVERFLOW does not suffice. */
|
|
||||||
if (! INT_ADD_OVERFLOW (rs, bs) && tmin <= rs + bs && rs + bs <= tmax)
|
|
||||||
rs += bs;
|
|
||||||
else
|
|
||||||
{
|
{
|
||||||
if (rs < 0)
|
if (bs < 0)
|
||||||
{
|
{
|
||||||
rs = tmin;
|
rs = TYPE_MINIMUM (time_t);
|
||||||
rns = 0;
|
rns = 0;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
high_overflow:
|
high_overflow:
|
||||||
rs = tmax;
|
rs = TYPE_MAXIMUM (time_t);
|
||||||
rns = TIMESPEC_HZ - 1;
|
rns = TIMESPEC_HZ - 1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -33,36 +33,30 @@ timespec_sub (struct timespec a, struct timespec b)
|
||||||
time_t bs = b.tv_sec;
|
time_t bs = b.tv_sec;
|
||||||
int ns = a.tv_nsec - b.tv_nsec;
|
int ns = a.tv_nsec - b.tv_nsec;
|
||||||
int rns = ns;
|
int rns = ns;
|
||||||
time_t tmin = TYPE_MINIMUM (time_t);
|
|
||||||
time_t tmax = TYPE_MAXIMUM (time_t);
|
|
||||||
|
|
||||||
if (ns < 0)
|
if (ns < 0)
|
||||||
{
|
{
|
||||||
rns = ns + TIMESPEC_HZ;
|
rns = ns + TIMESPEC_HZ;
|
||||||
if (bs < tmax)
|
time_t bs1;
|
||||||
bs++;
|
if (!INT_ADD_WRAPV (bs, 1, &bs1))
|
||||||
|
bs = bs1;
|
||||||
else if (- TYPE_SIGNED (time_t) < rs)
|
else if (- TYPE_SIGNED (time_t) < rs)
|
||||||
rs--;
|
rs--;
|
||||||
else
|
else
|
||||||
goto low_overflow;
|
goto low_overflow;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* INT_SUBTRACT_WRAPV is not appropriate since time_t might be unsigned.
|
if (INT_SUBTRACT_WRAPV (rs, bs, &rs))
|
||||||
In theory time_t might be narrower than int, so plain
|
|
||||||
INT_SUBTRACT_OVERFLOW does not suffice. */
|
|
||||||
if (! INT_SUBTRACT_OVERFLOW (rs, bs) && tmin <= rs - bs && rs - bs <= tmax)
|
|
||||||
rs -= bs;
|
|
||||||
else
|
|
||||||
{
|
{
|
||||||
if (rs < 0)
|
if (0 < bs)
|
||||||
{
|
{
|
||||||
low_overflow:
|
low_overflow:
|
||||||
rs = tmin;
|
rs = TYPE_MINIMUM (time_t);
|
||||||
rns = 0;
|
rns = 0;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
rs = tmax;
|
rs = TYPE_MAXIMUM (time_t);
|
||||||
rns = TIMESPEC_HZ - 1;
|
rns = TIMESPEC_HZ - 1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue