Quellcodebibliothek Statistik Leitseite products/sources/formale Sprachen/C/Firefox/ipc/glue/   (Browser von der Mozilla Stiftung Version 136.0.1©)  Datei vom 10.2.2025 mit Größe 3 kB image not shown  

Quelle  RawShmem.h   Sprache: C

 
/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
/* This Source Code Form is subject to the terms of the Mozilla Public
 * License, v. 2.0. If a copy of the MPL was not distributed with this
 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */


#ifndef MOZILLA_IPC_RAWSHMEM_H_
#define MOZILLA_IPC_RAWSHMEM_H_

#include "chrome/common/ipc_message_utils.h"
#include "mozilla/ipc/SharedMemory.h"
#include "mozilla/Span.h"
#include <utility>

namespace mozilla::ipc {

class WritableSharedMemoryMapping;

/// A handle to shared memory.
///
/// See the doc comment for `WritableSharedMemoryMapping` below.
class UnsafeSharedMemoryHandle {
  friend class WritableSharedMemoryMapping;
  friend struct IPC::ParamTraits<UnsafeSharedMemoryHandle>;

 public:
  UnsafeSharedMemoryHandle();
  UnsafeSharedMemoryHandle(UnsafeSharedMemoryHandle&& aOther) noexcept;
  UnsafeSharedMemoryHandle& operator=(
      UnsafeSharedMemoryHandle&& aOther) noexcept;

  /// Attempts to allocate a shmem.
  ///
  /// Returns `Nothing()` if allocation fails.
  /// If `aSize` is zero, a valid empty WritableSharedMemoryMapping is returned.
  static Maybe<std::pair<UnsafeSharedMemoryHandle, WritableSharedMemoryMapping>>
  CreateAndMap(size_t aSize);

 private:
  UnsafeSharedMemoryHandle(SharedMemory::Handle&& aHandle, uint64_t aSize)
      : mHandle(std::move(aHandle)), mSize(aSize) {}

  SharedMemory::Handle mHandle;
  uint64_t mSize;
};

/// A Shared memory buffer mapping.
///
/// Unlike `ipc::Shmem`, the underlying shared memory buffer on each side of
/// the process boundary is only deallocated with there respective
/// `WritableSharedMemoryMapping`.
///
/// ## Usage
///
/// Typical usage goes as follows:
/// - Allocate the memory using `UnsafeSharedMemoryHandle::Create`, returning a
///   handle and a mapping.
/// - Send the handle to the other process using an IPDL message.
/// - On the other process, map the shared memory by creating
///   WritableSharedMemoryMapping via `WritableSharedMemoryMapping::Open` and
///   the received handle.
///
/// Do not send the shared memory handle again, it is only intended to establish
/// the mapping on each side during initialization. The user of this class is
/// responsible for managing the lifetime of the buffers on each side, as well
/// as their identity, by for example storing them in hash map and referring to
/// them via IDs in IPDL message if need be.
///
/// ## Empty shmems
///
/// An empty WritableSharedMemoryMapping is one that was created with size zero.
/// It is analogous to a null RefPtr. It can be used like a non-empty shmem,
/// including sending the handle and openning it on another process (resulting
/// in an empty mapping on the other side).
class WritableSharedMemoryMapping {
  friend class UnsafeSharedMemoryHandle;

 public:
  WritableSharedMemoryMapping() = default;

  WritableSharedMemoryMapping(WritableSharedMemoryMapping&& aMoved) = default;

  WritableSharedMemoryMapping& operator=(WritableSharedMemoryMapping&& aMoved) =
      default;

  /// Open the shmem and immediately close the handle.
  static Maybe<WritableSharedMemoryMapping> Open(
      UnsafeSharedMemoryHandle aHandle);

  // Returns the size in bytes.
  size_t Size() const;

  // Returns the shared memory as byte range.
  Span<uint8_t> Bytes();

 private:
  explicit WritableSharedMemoryMapping(
      RefPtr<mozilla::ipc::SharedMemory>&& aRef);

  RefPtr<mozilla::ipc::SharedMemory> mRef;
};

}  // namespace mozilla::ipc

namespace IPC {
template <>
struct ParamTraits<mozilla::ipc::UnsafeSharedMemoryHandle> {
  typedef mozilla::ipc::UnsafeSharedMemoryHandle paramType;
  static void Write(IPC::MessageWriter* aWriter, paramType&& aVar);
  static bool Read(IPC::MessageReader* aReader, paramType* aVar);
};

}  // namespace IPC

#endif

Messung V0.5
C=92 H=95 G=93

¤ Dauer der Verarbeitung: 0.27 Sekunden  (vorverarbeitet)  ¤

*© Formatika GbR, Deutschland






Wurzel

Suchen

Beweissystem der NASA

Beweissystem Isabelle

NIST Cobol Testsuite

Cephes Mathematical Library

Wiener Entwicklungsmethode

Haftungshinweis

Die Informationen auf dieser Webseite wurden nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit, noch Qualität der bereit gestellten Informationen zugesichert.

Bemerkung:

Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.