| // Copyright 2018 The Chromium Authors. All rights reserved. | 
 | // 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_MAPPING_H_ | 
 | #define BASE_MEMORY_SHARED_MEMORY_MAPPING_H_ | 
 |  | 
 | #include <cstddef> | 
 |  | 
 | #include "base/macros.h" | 
 | #include "base/unguessable_token.h" | 
 |  | 
 | namespace base { | 
 |  | 
 | namespace subtle { | 
 | class PlatformSharedMemoryRegion; | 
 | }  // namespace subtle | 
 |  | 
 | // Base class for scoped handles to a shared memory mapping created from a | 
 | // shared memory region. Created shared memory mappings remain valid even if the | 
 | // creator region is transferred or destroyed. | 
 | // | 
 | // Each mapping has an UnguessableToken that identifies the shared memory region | 
 | // it was created from. This is used for memory metrics, to avoid overcounting | 
 | // shared memory. | 
 | class BASE_EXPORT SharedMemoryMapping { | 
 |  public: | 
 |   // Default constructor initializes an invalid instance. | 
 |   SharedMemoryMapping(); | 
 |  | 
 |   // Move operations are allowed. | 
 |   SharedMemoryMapping(SharedMemoryMapping&& mapping); | 
 |   SharedMemoryMapping& operator=(SharedMemoryMapping&& mapping); | 
 |  | 
 |   // Unmaps the region if the mapping is valid. | 
 |   virtual ~SharedMemoryMapping(); | 
 |  | 
 |   // Returns true iff the mapping is valid. False means there is no | 
 |   // corresponding area of memory. | 
 |   bool IsValid() const { return memory_ != nullptr; } | 
 |  | 
 |   // Returns the logical size of the mapping in bytes. This is precisely the | 
 |   // size requested by whoever created the mapping, and it is always less than | 
 |   // or equal to |mapped_size()|. This is undefined for invalid instances. | 
 |   size_t size() const { | 
 |     DCHECK(IsValid()); | 
 |     return size_; | 
 |   } | 
 |  | 
 |   // Returns the actual size of the mapping in bytes. This is always at least | 
 |   // as large as |size()| but may be larger due to platform mapping alignment | 
 |   // constraints. This is undefined for invalid instances. | 
 |   size_t mapped_size() const { | 
 |     DCHECK(IsValid()); | 
 |     return mapped_size_; | 
 |   } | 
 |  | 
 |   // Returns 128-bit GUID of the region this mapping belongs to. | 
 |   const UnguessableToken& guid() const { | 
 |     DCHECK(IsValid()); | 
 |     return guid_; | 
 |   } | 
 |  | 
 |  protected: | 
 |   SharedMemoryMapping(void* address, | 
 |                       size_t size, | 
 |                       size_t mapped_size, | 
 |                       const UnguessableToken& guid); | 
 |   void* raw_memory_ptr() const { return memory_; } | 
 |  | 
 |  private: | 
 |   friend class SharedMemoryTracker; | 
 |  | 
 |   void Unmap(); | 
 |  | 
 |   void* memory_ = nullptr; | 
 |   size_t size_ = 0; | 
 |   size_t mapped_size_ = 0; | 
 |   UnguessableToken guid_; | 
 |  | 
 |   DISALLOW_COPY_AND_ASSIGN(SharedMemoryMapping); | 
 | }; | 
 |  | 
 | // Class modeling a read-only mapping of a shared memory region into the | 
 | // current process' address space. This is created by ReadOnlySharedMemoryRegion | 
 | // instances. | 
 | class BASE_EXPORT ReadOnlySharedMemoryMapping : public SharedMemoryMapping { | 
 |  public: | 
 |   // Default constructor initializes an invalid instance. | 
 |   ReadOnlySharedMemoryMapping(); | 
 |  | 
 |   // Move operations are allowed. | 
 |   ReadOnlySharedMemoryMapping(ReadOnlySharedMemoryMapping&&); | 
 |   ReadOnlySharedMemoryMapping& operator=(ReadOnlySharedMemoryMapping&&); | 
 |  | 
 |   // Returns the base address of the mapping. This is read-only memory. This is | 
 |   // page-aligned. This is nullptr for invalid instances. | 
 |   const void* memory() const { return raw_memory_ptr(); } | 
 |  | 
 |  private: | 
 |   friend class ReadOnlySharedMemoryRegion; | 
 |   ReadOnlySharedMemoryMapping(void* address, | 
 |                               size_t size, | 
 |                               size_t mapped_size, | 
 |                               const UnguessableToken& guid); | 
 |  | 
 |   DISALLOW_COPY_AND_ASSIGN(ReadOnlySharedMemoryMapping); | 
 | }; | 
 |  | 
 | // Class modeling a writable mapping of a shared memory region into the | 
 | // current process' address space. This is created by *SharedMemoryRegion | 
 | // instances. | 
 | class BASE_EXPORT WritableSharedMemoryMapping : public SharedMemoryMapping { | 
 |  public: | 
 |   // Default constructor initializes an invalid instance. | 
 |   WritableSharedMemoryMapping(); | 
 |  | 
 |   // Move operations are allowed. | 
 |   WritableSharedMemoryMapping(WritableSharedMemoryMapping&&); | 
 |   WritableSharedMemoryMapping& operator=(WritableSharedMemoryMapping&&); | 
 |  | 
 |   // Returns the base address of the mapping. This is writable memory. This is | 
 |   // page-aligned. This is nullptr for invalid instances. | 
 |   void* memory() const { return raw_memory_ptr(); } | 
 |  | 
 |  private: | 
 |   friend WritableSharedMemoryMapping MapAtForTesting( | 
 |       subtle::PlatformSharedMemoryRegion* region, | 
 |       off_t offset, | 
 |       size_t size); | 
 |   friend class ReadOnlySharedMemoryRegion; | 
 |   friend class WritableSharedMemoryRegion; | 
 |   friend class UnsafeSharedMemoryRegion; | 
 |   WritableSharedMemoryMapping(void* address, | 
 |                               size_t size, | 
 |                               size_t mapped_size, | 
 |                               const UnguessableToken& guid); | 
 |  | 
 |   DISALLOW_COPY_AND_ASSIGN(WritableSharedMemoryMapping); | 
 | }; | 
 |  | 
 | }  // namespace base | 
 |  | 
 | #endif  // BASE_MEMORY_SHARED_MEMORY_MAPPING_H_ |