diff options
author | Abseil Team <absl-team@google.com> | 2018-05-22T23·34-0700 |
---|---|---|
committer | katzdm <katzdm@google.com> | 2018-05-23T15·44-0400 |
commit | 014f02a3eca93ef88163c3b408c86998ecf6572c (patch) | |
tree | 9c0dbee2aba37c06b954813bb649b576a93f4d97 /absl/base | |
parent | 3e671c7821e6f4d80db8089e7e580e5f7448a495 (diff) |
- 45b4111d940009bc7b3ebf621c9cb9293c60344a Use copied value i in lambda by Abseil Team <absl-team@google.com>
- b726b3102f8439b8480b6ff52fc3660162fa0bd9 Fix MSVC compiler warning on 32-bit platforms (GitHub iss... by Derek Mauro <dmauro@google.com> - a8a29e636c85bd7d82c0cbc824a1c2e498764337 Explicitly forbid to specify the template parameter to Wr... by Abseil Team <absl-team@google.com> - 566a1d903266fdbfdcf758401c356a0c6703422d Add missing license header to BUILD file. by Alex Strelnikov <strel@google.com> - ef1c0642cde0bbad62bbb30715256b232a4ab817 Fix BUILD file header. by Alex Strelnikov <strel@google.com> - b6e2cf00f808ee32b9eb7b3226af79d628742c20 Release GraphCycles microbenchmark. by Alex Strelnikov <strel@google.com> - f592d78f549e7a242bf2bb4858a26645a655eac3 Release Mutex microbenchmarks. by Alex Strelnikov <strel@google.com> GitOrigin-RevId: 45b4111d940009bc7b3ebf621c9cb9293c60344a Change-Id: I82885ae176952a764574c6d4616e312a977407b2
Diffstat (limited to 'absl/base')
-rw-r--r-- | absl/base/BUILD.bazel | 1 | ||||
-rw-r--r-- | absl/base/CMakeLists.txt | 1 | ||||
-rw-r--r-- | absl/base/internal/hide_ptr.h | 49 |
3 files changed, 51 insertions, 0 deletions
diff --git a/absl/base/BUILD.bazel b/absl/base/BUILD.bazel index 5c05c67831a2..3d3c7aea57b6 100644 --- a/absl/base/BUILD.bazel +++ b/absl/base/BUILD.bazel @@ -102,6 +102,7 @@ cc_library( cc_library( name = "base_internal", hdrs = [ + "internal/hide_ptr.h", "internal/identity.h", "internal/inline_variable.h", "internal/invoke.h", diff --git a/absl/base/CMakeLists.txt b/absl/base/CMakeLists.txt index 45640562786f..303533e26d1b 100644 --- a/absl/base/CMakeLists.txt +++ b/absl/base/CMakeLists.txt @@ -36,6 +36,7 @@ list(APPEND BASE_INTERNAL_HEADERS "internal/endian.h" "internal/exception_testing.h" "internal/exception_safety_testing.h" + "internal/hide_ptr.h" "internal/identity.h" "internal/invoke.h" "internal/inline_variable.h" diff --git a/absl/base/internal/hide_ptr.h b/absl/base/internal/hide_ptr.h new file mode 100644 index 000000000000..2c2e11f679a0 --- /dev/null +++ b/absl/base/internal/hide_ptr.h @@ -0,0 +1,49 @@ +// Copyright 2018 The Abseil Authors. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#ifndef ABSL_BASE_INTERNAL_HIDE_PTR_H_ +#define ABSL_BASE_INTERNAL_HIDE_PTR_H_ + +#include <cstdint> + +namespace absl { +namespace base_internal { + +// Arbitrary value with high bits set. Xor'ing with it is unlikely +// to map one valid pointer to another valid pointer. +constexpr uintptr_t HideMask() { + static_assert(sizeof(uintptr_t) == 4 || sizeof(uintptr_t) == 8, + "uintptr_t must be 32 or 64 bits"); + return sizeof(uintptr_t) == 8 ? 0xF03A5F7BF03A5F7BULL : 0xF03A5F7BUL; +} + +// Hide a pointer from the leak checker. For internal use only. +// Differs from absl::IgnoreLeak(ptr) in that absl::IgnoreLeak(ptr) causes ptr +// and all objects reachable from ptr to be ignored by the leak checker. +template <class T> +inline uintptr_t HidePtr(T* ptr) { + return reinterpret_cast<uintptr_t>(ptr) ^ HideMask(); +} + +// Return a pointer that has been hidden from the leak checker. +// For internal use only. +template <class T> +inline T* UnhidePtr(uintptr_t hidden) { + return reinterpret_cast<T*>(hidden ^ HideMask()); +} + +} // namespace base_internal +} // namespace absl + +#endif // ABSL_BASE_INTERNAL_HIDE_PTR_H_ |