Home | History | Annotate | Download | only in memory
      1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
      2 // Use of this source code is governed by a BSD-style license that can be
      3 // found in the LICENSE file.
      4 
      5 #ifndef BASE_MEMORY_REF_COUNTED_MEMORY_H_
      6 #define BASE_MEMORY_REF_COUNTED_MEMORY_H_
      7 
      8 #include <stddef.h>
      9 
     10 #include <memory>
     11 #include <string>
     12 #include <vector>
     13 
     14 #include "base/base_export.h"
     15 #include "base/macros.h"
     16 #include "base/memory/ref_counted.h"
     17 #include "base/memory/shared_memory.h"
     18 #include "base/memory/shared_memory_mapping.h"
     19 
     20 namespace base {
     21 
     22 class ReadOnlySharedMemoryRegion;
     23 
     24 // A generic interface to memory. This object is reference counted because most
     25 // of its subclasses own the data they carry, and this interface needs to
     26 // support heterogeneous containers of these different types of memory.
     27 class BASE_EXPORT RefCountedMemory
     28     : public RefCountedThreadSafe<RefCountedMemory> {
     29  public:
     30   // Retrieves a pointer to the beginning of the data we point to. If the data
     31   // is empty, this will return NULL.
     32   virtual const unsigned char* front() const = 0;
     33 
     34   // Size of the memory pointed to.
     35   virtual size_t size() const = 0;
     36 
     37   // Returns true if |other| is byte for byte equal.
     38   bool Equals(const scoped_refptr<RefCountedMemory>& other) const;
     39 
     40   // Handy method to simplify calling front() with a reinterpret_cast.
     41   template<typename T> const T* front_as() const {
     42     return reinterpret_cast<const T*>(front());
     43   }
     44 
     45  protected:
     46   friend class RefCountedThreadSafe<RefCountedMemory>;
     47   RefCountedMemory();
     48   virtual ~RefCountedMemory();
     49 };
     50 
     51 // An implementation of RefCountedMemory, where the ref counting does not
     52 // matter.
     53 class BASE_EXPORT RefCountedStaticMemory : public RefCountedMemory {
     54  public:
     55   RefCountedStaticMemory() : data_(nullptr), length_(0) {}
     56   RefCountedStaticMemory(const void* data, size_t length)
     57       : data_(static_cast<const unsigned char*>(length ? data : nullptr)),
     58         length_(length) {}
     59 
     60   // RefCountedMemory:
     61   const unsigned char* front() const override;
     62   size_t size() const override;
     63 
     64  private:
     65   ~RefCountedStaticMemory() override;
     66 
     67   const unsigned char* data_;
     68   size_t length_;
     69 
     70   DISALLOW_COPY_AND_ASSIGN(RefCountedStaticMemory);
     71 };
     72 
     73 // An implementation of RefCountedMemory, where the data is stored in a STL
     74 // vector.
     75 class BASE_EXPORT RefCountedBytes : public RefCountedMemory {
     76  public:
     77   RefCountedBytes();
     78 
     79   // Constructs a RefCountedBytes object by copying from |initializer|.
     80   explicit RefCountedBytes(const std::vector<unsigned char>& initializer);
     81 
     82   // Constructs a RefCountedBytes object by copying |size| bytes from |p|.
     83   RefCountedBytes(const unsigned char* p, size_t size);
     84 
     85   // Constructs a RefCountedBytes object by zero-initializing a new vector of
     86   // |size| bytes.
     87   explicit RefCountedBytes(size_t size);
     88 
     89   // Constructs a RefCountedBytes object by performing a swap. (To non
     90   // destructively build a RefCountedBytes, use the constructor that takes a
     91   // vector.)
     92   static scoped_refptr<RefCountedBytes> TakeVector(
     93       std::vector<unsigned char>* to_destroy);
     94 
     95   // RefCountedMemory:
     96   const unsigned char* front() const override;
     97   size_t size() const override;
     98 
     99   const std::vector<unsigned char>& data() const { return data_; }
    100   std::vector<unsigned char>& data() { return data_; }
    101 
    102   // Non-const versions of front() and front_as() that are simply shorthand for
    103   // data().data().
    104   unsigned char* front() { return data_.data(); }
    105   template <typename T>
    106   T* front_as() {
    107     return reinterpret_cast<T*>(front());
    108   }
    109 
    110  private:
    111   ~RefCountedBytes() override;
    112 
    113   std::vector<unsigned char> data_;
    114 
    115   DISALLOW_COPY_AND_ASSIGN(RefCountedBytes);
    116 };
    117 
    118 // An implementation of RefCountedMemory, where the bytes are stored in a STL
    119 // string. Use this if your data naturally arrives in that format.
    120 class BASE_EXPORT RefCountedString : public RefCountedMemory {
    121  public:
    122   RefCountedString();
    123 
    124   // Constructs a RefCountedString object by performing a swap. (To non
    125   // destructively build a RefCountedString, use the default constructor and
    126   // copy into object->data()).
    127   static scoped_refptr<RefCountedString> TakeString(std::string* to_destroy);
    128 
    129   // RefCountedMemory:
    130   const unsigned char* front() const override;
    131   size_t size() const override;
    132 
    133   const std::string& data() const { return data_; }
    134   std::string& data() { return data_; }
    135 
    136  private:
    137   ~RefCountedString() override;
    138 
    139   std::string data_;
    140 
    141   DISALLOW_COPY_AND_ASSIGN(RefCountedString);
    142 };
    143 
    144 // An implementation of RefCountedMemory, where the bytes are stored in
    145 // SharedMemory.
    146 class BASE_EXPORT RefCountedSharedMemory : public RefCountedMemory {
    147  public:
    148   // Constructs a RefCountedMemory object by taking ownership of an already
    149   // mapped SharedMemory object.
    150   RefCountedSharedMemory(std::unique_ptr<SharedMemory> shm, size_t size);
    151 
    152   // RefCountedMemory:
    153   const unsigned char* front() const override;
    154   size_t size() const override;
    155 
    156  private:
    157   ~RefCountedSharedMemory() override;
    158 
    159   const std::unique_ptr<SharedMemory> shm_;
    160   const size_t size_;
    161 
    162   DISALLOW_COPY_AND_ASSIGN(RefCountedSharedMemory);
    163 };
    164 
    165 // An implementation of RefCountedMemory, where the bytes are stored in
    166 // ReadOnlySharedMemoryMapping.
    167 class BASE_EXPORT RefCountedSharedMemoryMapping : public RefCountedMemory {
    168  public:
    169   // Constructs a RefCountedMemory object by taking ownership of an already
    170   // mapped ReadOnlySharedMemoryMapping object.
    171   explicit RefCountedSharedMemoryMapping(ReadOnlySharedMemoryMapping mapping);
    172 
    173   // Convenience method to map all of |region| and take ownership of the
    174   // mapping. Returns an empty scoped_refptr if the map operation fails.
    175   static scoped_refptr<RefCountedSharedMemoryMapping> CreateFromWholeRegion(
    176       const ReadOnlySharedMemoryRegion& region);
    177 
    178   // RefCountedMemory:
    179   const unsigned char* front() const override;
    180   size_t size() const override;
    181 
    182  private:
    183   ~RefCountedSharedMemoryMapping() override;
    184 
    185   const ReadOnlySharedMemoryMapping mapping_;
    186   const size_t size_;
    187 
    188   DISALLOW_COPY_AND_ASSIGN(RefCountedSharedMemoryMapping);
    189 };
    190 
    191 }  // namespace base
    192 
    193 #endif  // BASE_MEMORY_REF_COUNTED_MEMORY_H_
    194