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