// Copyright (c) 2015 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.
// Note: ported from Chromium commit head: 60f9667
#ifndef SHARED_MEMORY_REGION_H_
#define SHARED_MEMORY_REGION_H_
#include "base/memory/shared_memory.h"
#include "bitstream_buffer.h"
namespace media {
// Helper class to access a region of a SharedMemory. Different from
// SharedMemory, in which the |offset| of function MapAt() must be aligned to
// the value of |SysInfo::VMAllocationGranularity()|, the |offset| of a
// SharedMemoryRegion needs not to be aligned, this class hides the details
// and returns the mapped address of the given offset.
class SharedMemoryRegion {
public:
// Creates a SharedMemoryRegion.
// The mapped memory region begins at |offset| bytes from the start of the
// shared memory and the length is |size|. It will take the ownership of
// the |handle| and release the resource when being destroyed. Different
// from SharedMemory, the |offset| needs not to be aligned to the value of
// |SysInfo::VMAllocationGranularity()|.
SharedMemoryRegion(const base::SharedMemoryHandle& handle,
off_t offset,
size_t size,
bool read_only);
// Creates a SharedMemoryRegion from the given |bistream_buffer|.
SharedMemoryRegion(const BitstreamBuffer& bitstream_buffer, bool read_only);
// Maps the shared memory into the caller's address space.
// Return true on success, false otherwise.
bool Map();
// Gets a pointer to the mapped region if it has been mapped via Map().
// Returns |nullptr| if it is not mapped. The returned pointer points
// to the memory at the offset previously passed to the constructor.
void* memory();
size_t size() const { return size_; }
private:
base::SharedMemory shm_;
off_t offset_;
size_t size_;
size_t alignment_size_;
DISALLOW_COPY_AND_ASSIGN(SharedMemoryRegion);
};
} // namespace media
#endif // SHARED_MEMORY_REGION_H_