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