/* * Copyright (c) Meta Platforms, Inc. and affiliates. * * 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. */ #pragma once #include <folly/Traits.h> #include <folly/synchronization/AsymmetricThreadFence.h> #include <folly/synchronization/Hazptr-fwd.h> #include <folly/synchronization/HazptrDomain.h> #include <folly/synchronization/HazptrRec.h> #include <folly/synchronization/HazptrThrLocal.h> namespace folly { /// /// Classes related to hazard pointer holders. /// /** * hazptr_holder * * Class for automatic acquisition and release of hazard pointers, * and interface for hazard pointer operations. * * Usage example: * T* ptr; * { * hazptr_holder h = make_hazard_pointer(); * ptr = h.protect(src); * // ... *ptr is protected ... * h.reset_protection(); * // ... *ptr is not protected ... * ptr = src.load(); * while (!h.try_protect(ptr, src)) {} * // ... *ptr is protected ... * } * // ... *ptr is not protected */ template <template <typename> class Atom> class hazptr_holder { … }; // hazptr_holder /** * Free function make_hazard_pointer constructs nonempty holder */ template <template <typename> class Atom> FOLLY_ALWAYS_INLINE hazptr_holder<Atom> make_hazard_pointer( hazptr_domain<Atom>& domain) { … } /** * Free function. Swaps hazptr_holder-s. */ template <template <typename> class Atom> FOLLY_ALWAYS_INLINE void swap( hazptr_holder<Atom>& lhs, hazptr_holder<Atom>& rhs) noexcept { … } /** * Type used by hazptr_array and hazptr_local. */ aligned_hazptr_holder; /** * hazptr_array * * Optimized template for bulk construction and destruction of hazard * pointers. * * WARNING: Do not move from or to individual hazptr_holder-s. * Only move the whole hazptr_array. * * NOTE: It is allowed to swap an individual hazptr_holder that * belongs to hazptr_array with (a) a hazptr_holder object, or (b) a * hazptr_holder that is part of hazptr_array, under the conditions: * (i) both hazptr_holder-s are either both empty or both nonempty * and (ii) both belong to the same domain. */ template <uint8_t M, template <typename> class Atom> class hazptr_array { … }; // hazptr_array /** * Free function make_hazard_pointer_array constructs nonempty array */ template <uint8_t M, template <typename> class Atom> FOLLY_ALWAYS_INLINE hazptr_array<M, Atom> make_hazard_pointer_array() { … } /** * hazptr_local * * Optimized for construction and destruction of one or more * nonempty hazptr_holder-s with local scope. * * WARNING 1: Do not move from or to individual hazptr_holder-s. * * WARNING 2: There can only be one hazptr_local active for the same * thread at any time. This is not tracked and checked by the * implementation (except in debug mode) because it would negate the * performance gains of this class. */ template <uint8_t M, template <typename> class Atom> class hazptr_local { … }; // hazptr_local } // namespace folly