// Copyright 2024 The Chromium Authors // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. #ifndef BASE_MEMORY_SHARED_MEMORY_SAFETY_CHECKER_H_ #define BASE_MEMORY_SHARED_MEMORY_SAFETY_CHECKER_H_ #include <array> #include <atomic> #include <type_traits> namespace base::subtle { // Constraints on types that can be copied across memory spaces. This is a // non-exhaustive list and further constraints may be added in the future. // `kIsAllowed` is true unless T is known to be dangerous over shared memory. template <typename T> struct SharedMemorySafetyChecker { … }; // Pointers can't be shared across memory spaces. SharedMemorySafetyChecker<T>; // Atomics are dangerous to share across memory spaces unless they're lock-free. SharedMemorySafetyChecker<std::atomic<T>>; // Each element of an array must itself be safe. Although arrays aren't outright // banned, prefer to use GetMemoryAsSpan<T> for array-like access. SharedMemorySafetyChecker<T[N]>; SharedMemorySafetyChecker<std::array<T, N>>; AllowedOverSharedMemory; } // namespace base::subtle #endif // BASE_MEMORY_SHARED_MEMORY_SAFETY_CHECKER_H_