Home | History | Annotate | Download | only in common
      1 // Copyright (c) 2013 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 CONTENT_COMMON_HOST_SHARED_BITMAP_MANAGER_H_
      6 #define CONTENT_COMMON_HOST_SHARED_BITMAP_MANAGER_H_
      7 
      8 #include <map>
      9 #include <set>
     10 
     11 #include "base/basictypes.h"
     12 #include "base/compiler_specific.h"
     13 #include "base/containers/hash_tables.h"
     14 #include "base/hash.h"
     15 #include "base/memory/ref_counted.h"
     16 #include "base/memory/scoped_ptr.h"
     17 #include "base/memory/shared_memory.h"
     18 #include "base/synchronization/lock.h"
     19 #include "cc/resources/shared_bitmap_manager.h"
     20 #include "content/common/content_export.h"
     21 
     22 namespace BASE_HASH_NAMESPACE {
     23 #if defined(COMPILER_GCC)
     24 template <>
     25 struct hash<cc::SharedBitmapId> {
     26   size_t operator()(const cc::SharedBitmapId& id) const {
     27     return base::Hash(reinterpret_cast<const char*>(id.name), sizeof(id.name));
     28   }
     29 };
     30 #elif defined(COMPILER_MSVC)
     31 inline std::size_t hash_value(const cc::SharedBitmapId& id) {
     32   return base::Hash(reinterpret_cast<const char*>(id.name), sizeof(id.name));
     33 }
     34 #endif  // COMPILER
     35 }  // namespace BASE_HASH_NAMESPACE
     36 
     37 namespace content {
     38 class BitmapData;
     39 
     40 class CONTENT_EXPORT HostSharedBitmapManager : public cc::SharedBitmapManager {
     41  public:
     42   HostSharedBitmapManager();
     43   virtual ~HostSharedBitmapManager();
     44 
     45   static HostSharedBitmapManager* current();
     46 
     47   // cc::SharedBitmapManager implementation.
     48   virtual scoped_ptr<cc::SharedBitmap> AllocateSharedBitmap(
     49       const gfx::Size& size) OVERRIDE;
     50   virtual scoped_ptr<cc::SharedBitmap> GetSharedBitmapFromId(
     51       const gfx::Size& size,
     52       const cc::SharedBitmapId&) OVERRIDE;
     53   virtual scoped_ptr<cc::SharedBitmap> GetBitmapForSharedMemory(
     54       base::SharedMemory*) OVERRIDE;
     55 
     56   void AllocateSharedBitmapForChild(
     57       base::ProcessHandle process_handle,
     58       size_t buffer_size,
     59       const cc::SharedBitmapId& id,
     60       base::SharedMemoryHandle* shared_memory_handle);
     61   void ChildAllocatedSharedBitmap(size_t buffer_size,
     62                                   const base::SharedMemoryHandle& handle,
     63                                   base::ProcessHandle process_handle,
     64                                   const cc::SharedBitmapId& id);
     65   void ChildDeletedSharedBitmap(const cc::SharedBitmapId& id);
     66   void ProcessRemoved(base::ProcessHandle process_handle);
     67 
     68   size_t AllocatedBitmapCount() const { return handle_map_.size(); }
     69 
     70  private:
     71   void FreeSharedMemoryFromMap(cc::SharedBitmap* bitmap);
     72 
     73   base::Lock lock_;
     74 
     75   typedef base::hash_map<cc::SharedBitmapId, scoped_refptr<BitmapData> >
     76       BitmapMap;
     77   BitmapMap handle_map_;
     78 
     79   typedef base::hash_map<base::ProcessHandle,
     80                          base::hash_set<cc::SharedBitmapId> > ProcessMap;
     81   ProcessMap process_map_;
     82 };
     83 
     84 }  // namespace content
     85 
     86 #endif  // CONTENT_COMMON_HOST_SHARED_BITMAP_MANAGER_H_
     87