C++程序  |  58行  |  2.02 KB

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