From 26d8858eccf280ac5763db15e8b3eeed75489cf1 Mon Sep 17 00:00:00 2001 From: Abseil Team Date: Mon, 29 Jan 2018 16:28:44 -0800 Subject: Changes imported from Abseil "staging" branch: - 53419b5e123c4c9c47ecfe52ba747a271b03ae9c Add the sampling weight to MallocHook_SampledAlloc, so th... by Abseil Team - 8689c9a0dc685f50ba843a8d0d7d4274a1ec656a Factor out inline variable detection to separate macro. by Matt Calabrese - 0eac39ee9d81c03b8335c1cd3871d0dc4ec7bca7 Log the actual and expected durations for failed timing t... by Abseil Team GitOrigin-RevId: 53419b5e123c4c9c47ecfe52ba747a271b03ae9c Change-Id: I4ae8f5c0e924cdeee253fdf37d483d47893fc64c --- absl/base/internal/inline_variable.h | 30 +++++++++++++++++++++++++----- absl/base/internal/malloc_hook.h | 7 +++++-- absl/base/internal/malloc_hook_c.h | 1 + absl/synchronization/mutex_test.cc | 10 ++++++---- 4 files changed, 37 insertions(+), 11 deletions(-) diff --git a/absl/base/internal/inline_variable.h b/absl/base/internal/inline_variable.h index f7bb8c56..a65fe893 100644 --- a/absl/base/internal/inline_variable.h +++ b/absl/base/internal/inline_variable.h @@ -53,7 +53,24 @@ // it will likely be a reference type). //////////////////////////////////////////////////////////////////////////////// -#ifdef __cpp_inline_variables +// ABSL_INTERNAL_HAS_WARNING() +// +// If the compiler supports the `__has_warning` extension for detecting +// warnings, then this macro is defined to be `__has_warning`. +// +// If the compiler does not support `__has_warning`, invocations expand to 0. +// +// For clang's documentation of `__has_warning`, see +// https://clang.llvm.org/docs/LanguageExtensions.html#has-warning +#if defined(__has_warning) +#define ABSL_INTERNAL_HAS_WARNING __has_warning +#else // Otherwise, be optimistic and assume the warning is not enabled. +#define ABSL_INTERNAL_HAS_WARNING(warning) 0 +#endif // defined(__has_warning) + +// If the compiler supports inline variables and does not warn when used... +#if defined(__cpp_inline_variables) && \ + !ABSL_INTERNAL_HAS_WARNING("-Wc++98-c++11-c++14-compat") // Clang's -Wmissing-variable-declarations option erroneously warned that // inline constexpr objects need to be pre-declared. This has now been fixed, @@ -66,19 +83,21 @@ // identity_t is used here so that the const and name are in the // appropriate place for pointer types, reference types, function pointer // types, etc.. -#if defined(__clang__) +#if defined(__clang__) && \ + ABSL_INTERNAL_HAS_WARNING("-Wmissing-variable-declarations") #define ABSL_INTERNAL_EXTERN_DECL(type, name) \ extern const ::absl::internal::identity_t name; #else // Otherwise, just define the macro to do nothing. #define ABSL_INTERNAL_EXTERN_DECL(type, name) -#endif // defined(__clang__) +#endif // defined(__clang__) && + // ABSL_INTERNAL_HAS_WARNING("-Wmissing-variable-declarations") // See above comment at top of file for details. #define ABSL_INTERNAL_INLINE_CONSTEXPR(type, name, init) \ ABSL_INTERNAL_EXTERN_DECL(type, name) \ inline constexpr ::absl::internal::identity_t name = init -#else +#else // Otherwise, we need to emulate inline variables... // See above comment at top of file for details. // @@ -102,6 +121,7 @@ static_assert(sizeof(void (*)(decltype(name))) != 0, \ "Silence unused variable warnings.") -#endif // __cpp_inline_variables +#endif // defined(__cpp_inline_variables) && + // !ABSL_INTERNAL_HAS_WARNING("-Wc++98-c++11-c++14-compat") #endif // ABSL_BASE_INTERNAL_INLINE_VARIABLE_EMULATION_H_ diff --git a/absl/base/internal/malloc_hook.h b/absl/base/internal/malloc_hook.h index 7c1eaddb..6b006eda 100644 --- a/absl/base/internal/malloc_hook.h +++ b/absl/base/internal/malloc_hook.h @@ -91,8 +91,11 @@ class MallocHook { // SampledAlloc has the following fields: // * AllocHandle handle: to be set to an effectively unique value (in this // process) by allocator. - // * size_t allocated_size: space actually used by allocator to host - // the object. + // * size_t allocated_size: space actually used by allocator to host the + // object. Not necessarily equal to the requested size due to alignment + // and other reasons. + // * double weight: the expected number of allocations matching this profile + // that this sample represents. // * int stack_depth and const void* stack: invocation stack for // the allocation. // The allocator invoking the hook should record the handle value and later diff --git a/absl/base/internal/malloc_hook_c.h b/absl/base/internal/malloc_hook_c.h index ed41143a..7255ddc2 100644 --- a/absl/base/internal/malloc_hook_c.h +++ b/absl/base/internal/malloc_hook_c.h @@ -37,6 +37,7 @@ typedef struct { /* See malloc_hook.h for documentation for this struct. */ MallocHook_AllocHandle handle; size_t allocated_size; + double weight; int stack_depth; const void* stack; } MallocHook_SampledAlloc; diff --git a/absl/synchronization/mutex_test.cc b/absl/synchronization/mutex_test.cc index 5a5874de..53b93784 100644 --- a/absl/synchronization/mutex_test.cc +++ b/absl/synchronization/mutex_test.cc @@ -1234,10 +1234,12 @@ static void CheckResults(bool exp_result, bool act_result, absl::Duration act_duration) { ABSL_RAW_CHECK(exp_result == act_result, "CheckResults failed"); // Allow for some worse-case scheduling delay and clock skew. - ABSL_RAW_CHECK(exp_duration - absl::Milliseconds(40) <= act_duration, - "CheckResults failed"); - ABSL_RAW_CHECK(exp_duration + absl::Milliseconds(150) >= act_duration, - "CheckResults failed"); + if ((exp_duration - absl::Milliseconds(40) > act_duration) || + (exp_duration + absl::Milliseconds(150) < act_duration)) { + ABSL_RAW_LOG(FATAL, "CheckResults failed: operation took %s, expected %s", + absl::FormatDuration(act_duration).c_str(), + absl::FormatDuration(exp_duration).c_str()); + } } static void TestAwaitTimeout(Cond *cp, absl::Duration timeout, bool exp_result, -- cgit v1.2.3