Changes imported from Abseil "staging" branch:
- b76f5d50e1cb55050ef6004d6097dfdf0a806ff5 Fix ABSL_HAVE_THREAD_LOCAL for iOS < 8.0. by Matt Armstrong <marmstrong@google.com> - 1dc71788a3f4ef601e03cbea59e36901479cde35 Add missing #include <intrin.h> to use __nop() on MSVC. by Derek Mauro <dmauro@google.com> - f63ca6c7e87a7961912995b518b93af41b04bfa1 Fix typo (implict -> implicit) by Abseil Team <absl-team@google.com> - 8096006dc52368f166ccd22e25fcee334e142508 Fix a typo. by Abseil Team <absl-team@google.com> - c673a4a59790329fab33536caed6733dc03ec2a1 Add missing ":" in TODO. by Abseil Team <absl-team@google.com> - 8125d214356501af0f3a8b3bb577eed083f0493f Fix comment nit. by Abseil Team <absl-team@google.com> GitOrigin-RevId: b76f5d50e1cb55050ef6004d6097dfdf0a806ff5 Change-Id: I0168eb0c92b20ece2fe5ee54573c7720d00fd0b3
This commit is contained in:
parent
cdf20caa49
commit
8d8dcb0ae5
9 changed files with 37 additions and 11 deletions
|
@ -286,6 +286,7 @@ cc_test(
|
||||||
copts = ABSL_TEST_COPTS,
|
copts = ABSL_TEST_COPTS,
|
||||||
deps = [
|
deps = [
|
||||||
":config",
|
":config",
|
||||||
|
"//absl/synchronization:thread_pool",
|
||||||
"@com_google_googletest//:gtest_main",
|
"@com_google_googletest//:gtest_main",
|
||||||
],
|
],
|
||||||
)
|
)
|
||||||
|
|
|
@ -50,7 +50,7 @@ namespace absl {
|
||||||
//
|
//
|
||||||
// An `implicit_cast()` may also be used to annotate numeric type conversions
|
// An `implicit_cast()` may also be used to annotate numeric type conversions
|
||||||
// that, although safe, may produce compiler warnings (such as `long` to `int`).
|
// that, although safe, may produce compiler warnings (such as `long` to `int`).
|
||||||
// Additionally, an `implict_cast()` is also useful within return statements to
|
// Additionally, an `implicit_cast()` is also useful within return statements to
|
||||||
// indicate a specific implicit conversion is being undertaken.
|
// indicate a specific implicit conversion is being undertaken.
|
||||||
//
|
//
|
||||||
// Example:
|
// Example:
|
||||||
|
|
|
@ -56,6 +56,13 @@
|
||||||
#include <cstddef>
|
#include <cstddef>
|
||||||
#endif // __cplusplus
|
#endif // __cplusplus
|
||||||
|
|
||||||
|
#if defined(__APPLE__)
|
||||||
|
// Included for TARGET_OS_IPHONE, __IPHONE_OS_VERSION_MIN_REQUIRED,
|
||||||
|
// __IPHONE_8_0.
|
||||||
|
#include <Availability.h>
|
||||||
|
#include <TargetConditionals.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
#include "absl/base/policy_checks.h"
|
#include "absl/base/policy_checks.h"
|
||||||
|
|
||||||
// -----------------------------------------------------------------------------
|
// -----------------------------------------------------------------------------
|
||||||
|
@ -151,12 +158,13 @@
|
||||||
//
|
//
|
||||||
// Checks whether C++11's `thread_local` storage duration specifier is
|
// Checks whether C++11's `thread_local` storage duration specifier is
|
||||||
// supported.
|
// supported.
|
||||||
//
|
|
||||||
// Notes: Clang implements the `thread_local` keyword but Xcode did not support
|
|
||||||
// the implementation until Xcode 8.
|
|
||||||
#ifdef ABSL_HAVE_THREAD_LOCAL
|
#ifdef ABSL_HAVE_THREAD_LOCAL
|
||||||
#error ABSL_HAVE_THREAD_LOCAL cannot be directly set
|
#error ABSL_HAVE_THREAD_LOCAL cannot be directly set
|
||||||
#elif !defined(__apple_build_version__) || __apple_build_version__ >= 8000042
|
#elif !defined(__apple_build_version__) || \
|
||||||
|
((__apple_build_version__ >= 8000042) && \
|
||||||
|
!(TARGET_OS_IPHONE && __IPHONE_OS_VERSION_MIN_REQUIRED < __IPHONE_8_0))
|
||||||
|
// Notes: Xcode's clang did not support `thread_local` until version
|
||||||
|
// 8, and even then not for iOS < 8.0.
|
||||||
#define ABSL_HAVE_THREAD_LOCAL 1
|
#define ABSL_HAVE_THREAD_LOCAL 1
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
|
@ -17,12 +17,12 @@
|
||||||
#include <cstdint>
|
#include <cstdint>
|
||||||
|
|
||||||
#include "gtest/gtest.h"
|
#include "gtest/gtest.h"
|
||||||
|
#include "absl/synchronization/internal/thread_pool.h"
|
||||||
|
|
||||||
namespace {
|
namespace {
|
||||||
|
|
||||||
TEST(ConfigTest, Endianness) {
|
TEST(ConfigTest, Endianness) {
|
||||||
union
|
union {
|
||||||
{
|
|
||||||
uint32_t value;
|
uint32_t value;
|
||||||
uint8_t data[sizeof(uint32_t)];
|
uint8_t data[sizeof(uint32_t)];
|
||||||
} number;
|
} number;
|
||||||
|
@ -41,4 +41,20 @@ TEST(ConfigTest, Endianness) {
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#if defined(ABSL_HAVE_THREAD_LOCAL)
|
||||||
|
TEST(ConfigTest, ThreadLocal) {
|
||||||
|
static thread_local int mine_mine_mine = 16;
|
||||||
|
EXPECT_EQ(16, mine_mine_mine);
|
||||||
|
{
|
||||||
|
absl::synchronization_internal::ThreadPool pool(1);
|
||||||
|
pool.Schedule([&] {
|
||||||
|
EXPECT_EQ(16, mine_mine_mine);
|
||||||
|
mine_mine_mine = 32;
|
||||||
|
EXPECT_EQ(32, mine_mine_mine);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
EXPECT_EQ(16, mine_mine_mine);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
} // namespace
|
} // namespace
|
||||||
|
|
|
@ -46,6 +46,7 @@
|
||||||
// GCC will not tail call given inline volatile assembly.
|
// GCC will not tail call given inline volatile assembly.
|
||||||
#define ABSL_BLOCK_TAIL_CALL_OPTIMIZATION() __asm__ __volatile__("")
|
#define ABSL_BLOCK_TAIL_CALL_OPTIMIZATION() __asm__ __volatile__("")
|
||||||
#elif defined(_MSC_VER)
|
#elif defined(_MSC_VER)
|
||||||
|
#include <intrin.h>
|
||||||
// The __nop() intrinsic blocks the optimisation.
|
// The __nop() intrinsic blocks the optimisation.
|
||||||
#define ABSL_BLOCK_TAIL_CALL_OPTIMIZATION() __nop()
|
#define ABSL_BLOCK_TAIL_CALL_OPTIMIZATION() __nop()
|
||||||
#else
|
#else
|
||||||
|
|
|
@ -120,7 +120,7 @@ class FixedArray {
|
||||||
template <typename Iter, EnableIfForwardIterator<Iter> = 0>
|
template <typename Iter, EnableIfForwardIterator<Iter> = 0>
|
||||||
FixedArray(Iter first, Iter last) : rep_(first, last) {}
|
FixedArray(Iter first, Iter last) : rep_(first, last) {}
|
||||||
|
|
||||||
// Create the array from an initializer_list.
|
// Creates the array from an initializer_list.
|
||||||
FixedArray(std::initializer_list<T> init_list)
|
FixedArray(std::initializer_list<T> init_list)
|
||||||
: FixedArray(init_list.begin(), init_list.end()) {}
|
: FixedArray(init_list.begin(), init_list.end()) {}
|
||||||
|
|
||||||
|
|
|
@ -46,7 +46,7 @@ namespace absl {
|
||||||
// that occurs, existing uses of `uint128` will continue to work using that new
|
// that occurs, existing uses of `uint128` will continue to work using that new
|
||||||
// type.
|
// type.
|
||||||
//
|
//
|
||||||
// Note: code written with this type will continue to compile once `unint128_t`
|
// Note: code written with this type will continue to compile once `uint128_t`
|
||||||
// is introduced, provided the replacement helper functions
|
// is introduced, provided the replacement helper functions
|
||||||
// `Uint128(Low|High)64()` and `MakeUint128()` are made.
|
// `Uint128(Low|High)64()` and `MakeUint128()` are made.
|
||||||
//
|
//
|
||||||
|
|
|
@ -368,7 +368,7 @@ static uint64_t UpdateLastSample(
|
||||||
// into the fast past. That causes lots of register spills and reloads that
|
// into the fast past. That causes lots of register spills and reloads that
|
||||||
// are unnecessary unless the slow path is taken.
|
// are unnecessary unless the slow path is taken.
|
||||||
//
|
//
|
||||||
// TODO(absl-team) Remove this attribute when our compiler is smart enough
|
// TODO(absl-team): Remove this attribute when our compiler is smart enough
|
||||||
// to do the right thing.
|
// to do the right thing.
|
||||||
ABSL_ATTRIBUTE_NOINLINE
|
ABSL_ATTRIBUTE_NOINLINE
|
||||||
static int64_t GetCurrentTimeNanosSlowPath() LOCKS_EXCLUDED(lock) {
|
static int64_t GetCurrentTimeNanosSlowPath() LOCKS_EXCLUDED(lock) {
|
||||||
|
|
|
@ -246,7 +246,7 @@ class optional_data_base : public optional_data_dtor_base<T> {
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
// TODO(absl-team) Add another class using
|
// TODO(absl-team): Add another class using
|
||||||
// std::is_trivially_move_constructible trait when available to match
|
// std::is_trivially_move_constructible trait when available to match
|
||||||
// http://cplusplus.github.io/LWG/lwg-defects.html#2900, for types that
|
// http://cplusplus.github.io/LWG/lwg-defects.html#2900, for types that
|
||||||
// have trivial move but nontrivial copy.
|
// have trivial move but nontrivial copy.
|
||||||
|
|
Loading…
Reference in a new issue