/* * 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 <atomic> #include <cstdint> #include <memory> #include <mutex> #include <folly/Indestructible.h> #include <folly/concurrency/memory/ReadMostlySharedPtr.h> #include <folly/synchronization/Rcu.h> namespace folly { namespace detail { extern Indestructible<std::mutex> atomicReadMostlyMu; extern Indestructible<rcu_domain> atomicReadMostlyDomain; } // namespace detail /* * What atomic_shared_ptr is to shared_ptr, AtomicReadMostlyMainPtr is to * ReadMostlyMainPtr; it allows racy conflicting accesses to one. This gives * true shared_ptr-like semantics, including reclamation at the point where the * last pointer to an object goes away. * * It's about the same speed (slightly slower) as ReadMostlyMainPtr. The most * significant feature they share is avoiding reader-reader contention and * atomic RMWs in the absence of writes. */ template <typename T> class AtomicReadMostlyMainPtr { … }; } // namespace folly