chromium/base/memory/shared_memory_safety_checker.h

// 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_