diff options
author | Jonathan Wakely <jwakely@redhat.com> | 2020-11-13 20:57:15 +0000 |
---|---|---|
committer | Jonathan Wakely <jwakely@redhat.com> | 2020-11-13 23:08:34 +0000 |
commit | b8d36dcc917e8a06d8c20b9f5ecc920ed2b9e947 (patch) | |
tree | 1986498a8cec7f68b12ee48d5f351226db6249f8 /libstdc++-v3/src | |
parent | e400a64936efdc2424044aa74c0424df16242d2d (diff) | |
download | gcc-b8d36dcc917e8a06d8c20b9f5ecc920ed2b9e947.zip gcc-b8d36dcc917e8a06d8c20b9f5ecc920ed2b9e947.tar.gz gcc-b8d36dcc917e8a06d8c20b9f5ecc920ed2b9e947.tar.bz2 |
libstdc++: Remove redundant overflow check for futex timeout [PR 93456]
The relative_timespec function already checks for the case where the
specified timeout is in the past, so the difference can never be
negative. That means we dn't need to check if it's more negative than
the minimum time_t value.
libstdc++-v3/ChangeLog:
PR libstdc++/93456
* src/c++11/futex.cc (relative_timespec): Remove redundant check
negative values.
* testsuite/30_threads/future/members/wait_until_overflow.cc: Moved to...
* testsuite/30_threads/future/members/93456.cc: ...here.
Diffstat (limited to 'libstdc++-v3/src')
-rw-r--r-- | libstdc++-v3/src/c++11/futex.cc | 26 |
1 files changed, 14 insertions, 12 deletions
diff --git a/libstdc++-v3/src/c++11/futex.cc b/libstdc++-v3/src/c++11/futex.cc index 15959ce..c008798 100644 --- a/libstdc++-v3/src/c++11/futex.cc +++ b/libstdc++-v3/src/c++11/futex.cc @@ -73,21 +73,23 @@ namespace return rt; } - auto rel_s = abs_s.count() - now_s; + const auto rel_s = abs_s.count() - now_s; - // Avoid overflows + // Convert the absolute timeout to a relative timeout, without overflow. if (rel_s > __int_traits<time_t>::__max) [[unlikely]] - rel_s = __int_traits<time_t>::__max; - else if (rel_s < __int_traits<time_t>::__min) [[unlikely]] - rel_s = __int_traits<time_t>::__min; - - // Convert the absolute timeout value to a relative timeout - rt.tv_sec = rel_s; - rt.tv_nsec = abs_ns.count() - now_ns; - if (rt.tv_nsec < 0) { - rt.tv_nsec += 1000000000; - --rt.tv_sec; + rt.tv_sec = __int_traits<time_t>::__max; + rt.tv_nsec = 999999999; + } + else + { + rt.tv_sec = rel_s; + rt.tv_nsec = abs_ns.count() - now_ns; + if (rt.tv_nsec < 0) + { + rt.tv_nsec += 1000000000; + --rt.tv_sec; + } } return rt; |