merge(3p/absl): subtree merge of Abseil up to e19260f
... notably, this includes Abseil's own StatusOr type, which conflicted with our implementation (that was taken from TensorFlow). Change-Id: Ie7d6764b64055caaeb8dc7b6b9d066291e6b538f
This commit is contained in:
parent
cc27324d02
commit
082c006c04
854 changed files with 11260 additions and 5296 deletions
|
|
@ -26,6 +26,7 @@
|
|||
#define ABSL_SYNCHRONIZATION_INTERNAL_KERNEL_TIMEOUT_H_
|
||||
|
||||
#include <time.h>
|
||||
|
||||
#include <algorithm>
|
||||
#include <limits>
|
||||
|
||||
|
|
@ -57,6 +58,10 @@ class KernelTimeout {
|
|||
|
||||
bool has_timeout() const { return ns_ != 0; }
|
||||
|
||||
// Convert to parameter for sem_timedwait/futex/similar. Only for approved
|
||||
// users. Do not call if !has_timeout.
|
||||
struct timespec MakeAbsTimespec();
|
||||
|
||||
private:
|
||||
// internal rep, not user visible: ns after unix epoch.
|
||||
// zero = no timeout.
|
||||
|
|
@ -82,34 +87,6 @@ class KernelTimeout {
|
|||
return x;
|
||||
}
|
||||
|
||||
// Convert to parameter for sem_timedwait/futex/similar. Only for approved
|
||||
// users. Do not call if !has_timeout.
|
||||
struct timespec MakeAbsTimespec() {
|
||||
int64_t n = ns_;
|
||||
static const int64_t kNanosPerSecond = 1000 * 1000 * 1000;
|
||||
if (n == 0) {
|
||||
ABSL_RAW_LOG(
|
||||
ERROR,
|
||||
"Tried to create a timespec from a non-timeout; never do this.");
|
||||
// But we'll try to continue sanely. no-timeout ~= saturated timeout.
|
||||
n = (std::numeric_limits<int64_t>::max)();
|
||||
}
|
||||
|
||||
// Kernel APIs validate timespecs as being at or after the epoch,
|
||||
// despite the kernel time type being signed. However, no one can
|
||||
// tell the difference between a timeout at or before the epoch (since
|
||||
// all such timeouts have expired!)
|
||||
if (n < 0) n = 0;
|
||||
|
||||
struct timespec abstime;
|
||||
int64_t seconds = (std::min)(n / kNanosPerSecond,
|
||||
int64_t{(std::numeric_limits<time_t>::max)()});
|
||||
abstime.tv_sec = static_cast<time_t>(seconds);
|
||||
abstime.tv_nsec =
|
||||
static_cast<decltype(abstime.tv_nsec)>(n % kNanosPerSecond);
|
||||
return abstime;
|
||||
}
|
||||
|
||||
#ifdef _WIN32
|
||||
// Converts to milliseconds from now, or INFINITE when
|
||||
// !has_timeout(). For use by SleepConditionVariableSRW on
|
||||
|
|
@ -148,6 +125,30 @@ class KernelTimeout {
|
|||
friend class Waiter;
|
||||
};
|
||||
|
||||
inline struct timespec KernelTimeout::MakeAbsTimespec() {
|
||||
int64_t n = ns_;
|
||||
static const int64_t kNanosPerSecond = 1000 * 1000 * 1000;
|
||||
if (n == 0) {
|
||||
ABSL_RAW_LOG(
|
||||
ERROR, "Tried to create a timespec from a non-timeout; never do this.");
|
||||
// But we'll try to continue sanely. no-timeout ~= saturated timeout.
|
||||
n = (std::numeric_limits<int64_t>::max)();
|
||||
}
|
||||
|
||||
// Kernel APIs validate timespecs as being at or after the epoch,
|
||||
// despite the kernel time type being signed. However, no one can
|
||||
// tell the difference between a timeout at or before the epoch (since
|
||||
// all such timeouts have expired!)
|
||||
if (n < 0) n = 0;
|
||||
|
||||
struct timespec abstime;
|
||||
int64_t seconds = (std::min)(n / kNanosPerSecond,
|
||||
int64_t{(std::numeric_limits<time_t>::max)()});
|
||||
abstime.tv_sec = static_cast<time_t>(seconds);
|
||||
abstime.tv_nsec = static_cast<decltype(abstime.tv_nsec)>(n % kNanosPerSecond);
|
||||
return abstime;
|
||||
}
|
||||
|
||||
} // namespace synchronization_internal
|
||||
ABSL_NAMESPACE_END
|
||||
} // namespace absl
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue