Index: content/child/child_shared_bitmap_manager.cc |
diff --git a/content/child/child_shared_bitmap_manager.cc b/content/child/child_shared_bitmap_manager.cc |
index aa9f1f37ba6dd854418aab8be314b2ece5d091c4..66982328c70b1d5d23359aa07411b5d19b7bd75a 100644 |
--- a/content/child/child_shared_bitmap_manager.cc |
+++ b/content/child/child_shared_bitmap_manager.cc |
@@ -4,6 +4,8 @@ |
#include "content/child/child_shared_bitmap_manager.h" |
+#include "base/debug/alias.h" |
+#include "base/process/process_metrics.h" |
#include "content/child/child_thread.h" |
#include "content/common/child_process_messages.h" |
#include "ui/gfx/size.h" |
@@ -38,6 +40,33 @@ class ChildSharedBitmap : public SharedMemoryBitmap { |
scoped_ptr<base::SharedMemory> shared_memory_holder_; |
}; |
+#if defined(OS_WIN) |
+ |
+// Collect extra information for debugging bitmap creation failures. |
+void CollectMemoryUsageAndDie(const gfx::Size& size) { |
+ int width = size.width(); |
+ int height = size.height(); |
+ DWORD last_error = GetLastError(); |
+ |
+ scoped_ptr<base::ProcessMetrics> metrics( |
+ base::ProcessMetrics::CreateProcessMetrics( |
+ base::GetCurrentProcessHandle())); |
+ |
+ size_t private_bytes = 0; |
+ size_t shared_bytes = 0; |
+ metrics->GetMemoryBytes(&private_bytes, &shared_bytes); |
+ |
+ base::debug::Alias(&width); |
+ base::debug::Alias(&height); |
+ base::debug::Alias(&last_error); |
+ base::debug::Alias(&private_bytes); |
+ base::debug::Alias(&shared_bytes); |
+ |
+ CHECK(false); |
+} |
+ |
+#endif |
+ |
} // namespace |
SharedMemoryBitmap::SharedMemoryBitmap(uint8* pixels, |
@@ -83,9 +112,18 @@ ChildSharedBitmapManager::AllocateSharedMemoryBitmap(const gfx::Size& size) { |
CHECK(false); |
#else |
memory = ChildThread::AllocateSharedMemory(memory_size, sender_.get()); |
+#if defined(OS_WIN) |
+ if (!memory) |
+ CollectMemoryUsageAndDie(size); |
+#endif |
+ |
CHECK(memory); |
- if (!memory->Map(memory_size)) |
+ if (!memory->Map(memory_size)) { |
+#if defined(OS_WIN) |
+ CollectMemoryUsageAndDie(size); |
+#endif |
CHECK(false); |
+ } |
base::SharedMemoryHandle handle_to_send = memory->handle(); |
sender_->Send(new ChildProcessHostMsg_AllocatedSharedBitmap( |
memory_size, handle_to_send, id)); |