Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(197)

Side by Side Diff: content/child/child_shared_bitmap_manager.cc

Issue 1039043002: Add base::TerminateBecauseOutOfMemory (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Thu Mar 26 16:12:29 PDT 2015 Created 5 years, 9 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 // Copyright (c) 2013 The Chromium Authors. All rights reserved. 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 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "content/child/child_shared_bitmap_manager.h" 5 #include "content/child/child_shared_bitmap_manager.h"
6 6
7 #include "base/debug/alias.h" 7 #include "base/debug/alias.h"
8 #include "base/process/memory.h"
8 #include "base/process/process_metrics.h" 9 #include "base/process/process_metrics.h"
9 #include "content/child/child_thread_impl.h" 10 #include "content/child/child_thread_impl.h"
10 #include "content/common/child_process_messages.h" 11 #include "content/common/child_process_messages.h"
11 #include "ui/gfx/geometry/size.h" 12 #include "ui/gfx/geometry/size.h"
12 13
13 namespace content { 14 namespace content {
14 15
15 namespace { 16 namespace {
16 17
17 class ChildSharedBitmap : public SharedMemoryBitmap { 18 class ChildSharedBitmap : public SharedMemoryBitmap {
(...skipping 15 matching lines...) Expand all
33 34
34 ~ChildSharedBitmap() override { 35 ~ChildSharedBitmap() override {
35 sender_->Send(new ChildProcessHostMsg_DeletedSharedBitmap(id())); 36 sender_->Send(new ChildProcessHostMsg_DeletedSharedBitmap(id()));
36 } 37 }
37 38
38 private: 39 private:
39 scoped_refptr<ThreadSafeSender> sender_; 40 scoped_refptr<ThreadSafeSender> sender_;
40 scoped_ptr<base::SharedMemory> shared_memory_holder_; 41 scoped_ptr<base::SharedMemory> shared_memory_holder_;
41 }; 42 };
42 43
43 #if defined(OS_WIN)
44
45 // Collect extra information for debugging bitmap creation failures. 44 // Collect extra information for debugging bitmap creation failures.
46 void CollectMemoryUsageAndDie(const gfx::Size& size) { 45 void CollectMemoryUsageAndDie(const gfx::Size& size) {
46 #if defined(OS_WIN)
47 int width = size.width(); 47 int width = size.width();
48 int height = size.height(); 48 int height = size.height();
49 DWORD last_error = GetLastError(); 49 DWORD last_error = GetLastError();
50 50
51 scoped_ptr<base::ProcessMetrics> metrics( 51 scoped_ptr<base::ProcessMetrics> metrics(
52 base::ProcessMetrics::CreateProcessMetrics( 52 base::ProcessMetrics::CreateProcessMetrics(
53 base::GetCurrentProcessHandle())); 53 base::GetCurrentProcessHandle()));
54 54
55 size_t private_bytes = 0; 55 size_t private_bytes = 0;
56 size_t shared_bytes = 0; 56 size_t shared_bytes = 0;
57 metrics->GetMemoryBytes(&private_bytes, &shared_bytes); 57 metrics->GetMemoryBytes(&private_bytes, &shared_bytes);
58 58
59 base::debug::Alias(&width); 59 base::debug::Alias(&width);
60 base::debug::Alias(&height); 60 base::debug::Alias(&height);
61 base::debug::Alias(&last_error); 61 base::debug::Alias(&last_error);
62 base::debug::Alias(&private_bytes); 62 base::debug::Alias(&private_bytes);
63 base::debug::Alias(&shared_bytes); 63 base::debug::Alias(&shared_bytes);
64 64 #endif
65 CHECK(false); 65 base::CrashWithOutOfMemory();
66 } 66 }
67 67
68 #endif
69
70 } // namespace 68 } // namespace
71 69
72 SharedMemoryBitmap::SharedMemoryBitmap(uint8* pixels, 70 SharedMemoryBitmap::SharedMemoryBitmap(uint8* pixels,
73 const cc::SharedBitmapId& id, 71 const cc::SharedBitmapId& id,
74 base::SharedMemory* shared_memory) 72 base::SharedMemory* shared_memory)
75 : SharedBitmap(pixels, id), shared_memory_(shared_memory) { 73 : SharedBitmap(pixels, id), shared_memory_(shared_memory) {
76 } 74 }
77 75
78 ChildSharedBitmapManager::ChildSharedBitmapManager( 76 ChildSharedBitmapManager::ChildSharedBitmapManager(
79 scoped_refptr<ThreadSafeSender> sender) 77 scoped_refptr<ThreadSafeSender> sender)
(...skipping 22 matching lines...) Expand all
102 if (!cc::SharedBitmap::SizeInBytes(size, &memory_size)) 100 if (!cc::SharedBitmap::SizeInBytes(size, &memory_size))
103 return scoped_ptr<SharedMemoryBitmap>(); 101 return scoped_ptr<SharedMemoryBitmap>();
104 cc::SharedBitmapId id = cc::SharedBitmap::GenerateId(); 102 cc::SharedBitmapId id = cc::SharedBitmap::GenerateId();
105 scoped_ptr<base::SharedMemory> memory; 103 scoped_ptr<base::SharedMemory> memory;
106 #if defined(OS_POSIX) 104 #if defined(OS_POSIX)
107 base::SharedMemoryHandle handle; 105 base::SharedMemoryHandle handle;
108 sender_->Send(new ChildProcessHostMsg_SyncAllocateSharedBitmap( 106 sender_->Send(new ChildProcessHostMsg_SyncAllocateSharedBitmap(
109 memory_size, id, &handle)); 107 memory_size, id, &handle));
110 memory = make_scoped_ptr(new base::SharedMemory(handle, false)); 108 memory = make_scoped_ptr(new base::SharedMemory(handle, false));
111 if (!memory->Map(memory_size)) 109 if (!memory->Map(memory_size))
112 CHECK(false); 110 CollectMemoryUsageAndDie(size);
113 #else 111 #else
114 memory = ChildThreadImpl::AllocateSharedMemory(memory_size, sender_.get()); 112 memory = ChildThreadImpl::AllocateSharedMemory(memory_size, sender_.get());
115 #if defined(OS_WIN)
116 if (!memory) 113 if (!memory)
117 CollectMemoryUsageAndDie(size); 114 CollectMemoryUsageAndDie(size);
118 #endif
119 115
120 CHECK(memory); 116 if (!memory->Map(memory_size))
121 if (!memory->Map(memory_size)) {
122 #if defined(OS_WIN)
123 CollectMemoryUsageAndDie(size); 117 CollectMemoryUsageAndDie(size);
124 #endif 118
125 CHECK(false);
126 }
127 base::SharedMemoryHandle handle_to_send = memory->handle(); 119 base::SharedMemoryHandle handle_to_send = memory->handle();
128 sender_->Send(new ChildProcessHostMsg_AllocatedSharedBitmap( 120 sender_->Send(new ChildProcessHostMsg_AllocatedSharedBitmap(
129 memory_size, handle_to_send, id)); 121 memory_size, handle_to_send, id));
130 #endif 122 #endif
131 return make_scoped_ptr(new ChildSharedBitmap(sender_, memory.Pass(), id)); 123 return make_scoped_ptr(new ChildSharedBitmap(sender_, memory.Pass(), id));
132 } 124 }
133 125
134 scoped_ptr<cc::SharedBitmap> ChildSharedBitmapManager::GetSharedBitmapFromId( 126 scoped_ptr<cc::SharedBitmap> ChildSharedBitmapManager::GetSharedBitmapFromId(
135 const gfx::Size&, 127 const gfx::Size&,
136 const cc::SharedBitmapId&) { 128 const cc::SharedBitmapId&) {
137 NOTREACHED(); 129 NOTREACHED();
138 return scoped_ptr<cc::SharedBitmap>(); 130 return scoped_ptr<cc::SharedBitmap>();
139 } 131 }
140 132
141 scoped_ptr<cc::SharedBitmap> ChildSharedBitmapManager::GetBitmapForSharedMemory( 133 scoped_ptr<cc::SharedBitmap> ChildSharedBitmapManager::GetBitmapForSharedMemory(
142 base::SharedMemory* mem) { 134 base::SharedMemory* mem) {
143 cc::SharedBitmapId id = cc::SharedBitmap::GenerateId(); 135 cc::SharedBitmapId id = cc::SharedBitmap::GenerateId();
144 base::SharedMemoryHandle handle_to_send = mem->handle(); 136 base::SharedMemoryHandle handle_to_send = mem->handle();
145 #if defined(OS_POSIX) 137 #if defined(OS_POSIX)
146 if (!mem->ShareToProcess(base::GetCurrentProcessHandle(), &handle_to_send)) 138 if (!mem->ShareToProcess(base::GetCurrentProcessHandle(), &handle_to_send))
147 return scoped_ptr<cc::SharedBitmap>(); 139 return scoped_ptr<cc::SharedBitmap>();
148 #endif 140 #endif
149 sender_->Send(new ChildProcessHostMsg_AllocatedSharedBitmap( 141 sender_->Send(new ChildProcessHostMsg_AllocatedSharedBitmap(
150 mem->mapped_size(), handle_to_send, id)); 142 mem->mapped_size(), handle_to_send, id));
151 143
152 return make_scoped_ptr(new ChildSharedBitmap(sender_, mem, id)); 144 return make_scoped_ptr(new ChildSharedBitmap(sender_, mem, id));
153 } 145 }
154 146
155 } // namespace content 147 } // namespace content
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698