| // 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 MEDIA_BASE_UNALIGNED_SHARED_MEMORY_H_ |
| #define MEDIA_BASE_UNALIGNED_SHARED_MEMORY_H_ |
| |
| #include <stdint.h> |
| |
| #include "base/macros.h" |
| #include "base/memory/platform_shared_memory_region.h" |
| #include "base/memory/read_only_shared_memory_region.h" |
| #include "base/memory/shared_memory_mapping.h" |
| #include "base/memory/unsafe_shared_memory_region.h" |
| #include "media/base/media_export.h" |
| |
| namespace media { |
| |
| // Wrapper over base::PlatformSharedMemoryRegion that can be mapped at unaligned |
| // offsets. |
| // DEPRECATED! See https://crbug.com/795291. |
| class MEDIA_EXPORT UnalignedSharedMemory { |
| public: |
| // Creates an |UnalignedSharedMemory| instance from a |
| // |PlatformSharedMemoryRegion|. |size| sets the maximum size that may be |
| // mapped. This instance will own the handle. |
| UnalignedSharedMemory(base::subtle::PlatformSharedMemoryRegion region, |
| size_t size, |
| bool read_only); |
| |
| UnalignedSharedMemory(const UnalignedSharedMemory&) = delete; |
| UnalignedSharedMemory& operator=(const UnalignedSharedMemory&) = delete; |
| |
| ~UnalignedSharedMemory(); |
| |
| // Map the shared memory region. Note that the passed |size| parameter should |
| // be less than or equal to |size()|. |
| bool MapAt(off_t offset, size_t size); |
| size_t size() const { return size_; } |
| void* memory() const { return mapping_ptr_; } |
| |
| private: |
| // Only one of the mappings is active, depending on the value of |read_only_|. |
| // These variables are held to keep the shared memory mapping valid for the |
| // lifetime of this instance. |
| base::subtle::PlatformSharedMemoryRegion region_; |
| base::WritableSharedMemoryMapping writable_mapping_; |
| base::ReadOnlySharedMemoryMapping read_only_mapping_; |
| |
| // If the mapping should be made read-only. |
| bool read_only_; |
| |
| // The size of the region associated with |region_|. |
| size_t size_; |
| |
| // Pointer to the unaligned data in the shared memory mapping. |
| uint8_t* mapping_ptr_ = nullptr; |
| }; |
| |
| // Wrapper over base::WritableSharedMemoryMapping that is mapped at unaligned |
| // offsets. |
| class MEDIA_EXPORT WritableUnalignedMapping { |
| public: |
| // Creates an |WritableUnalignedMapping| instance from a |
| // |UnsafeSharedMemoryRegion|. |size| sets the maximum size that may be mapped |
| // within |region| and |offset| is the offset that will be mapped. |region| is |
| // not retained and is used only in the constructor. |
| WritableUnalignedMapping(const base::UnsafeSharedMemoryRegion& region, |
| size_t size, |
| off_t offset); |
| |
| WritableUnalignedMapping(const WritableUnalignedMapping&) = delete; |
| WritableUnalignedMapping& operator=(const WritableUnalignedMapping&) = delete; |
| |
| ~WritableUnalignedMapping(); |
| |
| size_t size() const { return size_; } |
| void* memory() const; |
| |
| // True if the mapping backing the memory is valid. |
| bool IsValid() const { return mapping_.IsValid(); } |
| |
| private: |
| base::WritableSharedMemoryMapping mapping_; |
| |
| // The size of the region associated with |mapping_|. |
| size_t size_; |
| |
| // Difference between actual offset within |mapping_| where data has been |
| // mapped and requested offset; strictly less than |
| // base::SysInfo::VMAllocationGranularity(). |
| size_t misalignment_; |
| }; |
| |
| // Wrapper over base::ReadOnlySharedMemoryMapping that is mapped at unaligned |
| // offsets. |
| class MEDIA_EXPORT ReadOnlyUnalignedMapping { |
| public: |
| // Creates an |WritableUnalignedMapping| instance from a |
| // |ReadOnlySharedMemoryRegion|. |size| sets the maximum size that may be |
| // mapped within |region| and |offset| is the offset that will be mapped. |
| // |region| is not retained and is used only in the constructor. |
| ReadOnlyUnalignedMapping(const base::ReadOnlySharedMemoryRegion& region, |
| size_t size, |
| off_t offset); |
| |
| ReadOnlyUnalignedMapping(const ReadOnlyUnalignedMapping&) = delete; |
| ReadOnlyUnalignedMapping& operator=(const ReadOnlyUnalignedMapping&) = delete; |
| |
| ~ReadOnlyUnalignedMapping(); |
| |
| size_t size() const { return size_; } |
| const void* memory() const; |
| |
| // True if the mapping backing the memory is valid. |
| bool IsValid() const { return mapping_.IsValid(); } |
| |
| private: |
| base::ReadOnlySharedMemoryMapping mapping_; |
| |
| // The size of the region associated with |mapping_|. |
| size_t size_; |
| |
| // Difference between actual offset within |mapping_| where data has been |
| // mapped and requested offset; strictly less than |
| // base::SysInfo::VMAllocationGranularity(). |
| size_t misalignment_; |
| }; |
| |
| } // namespace media |
| |
| #endif // MEDIA_BASE_UNALIGNED_SHARED_MEMORY_H_ |