Index: content/common/child_thread.cc |
=================================================================== |
--- content/common/child_thread.cc (revision 105562) |
+++ content/common/child_thread.cc (working copy) |
@@ -125,6 +125,39 @@ |
return resource_dispatcher()->CreateBridge(request_info); |
} |
+base::SharedMemory* ChildThread::AllocateSharedMemory( |
+ size_t buf_size) { |
+ scoped_ptr<base::SharedMemory> shared_buf; |
+#if defined(OS_WIN) |
+ shared_buf.reset(new base::SharedMemory); |
+ if (!shared_buf->CreateAndMapAnonymous(buf_size)) { |
+ NOTREACHED(); |
+ return NULL; |
+ } |
+#else |
+ // On POSIX, we need to ask the browser to create the shared memory for us, |
+ // since this is blocked by the sandbox. |
+ base::SharedMemoryHandle shared_mem_handle; |
+ if (Send(new ChildProcessHostMsg_SyncAllocateSharedMemory( |
+ buf_size, &shared_mem_handle))) { |
+ if (base::SharedMemory::IsHandleValid(shared_mem_handle)) { |
+ shared_buf.reset(new base::SharedMemory(shared_mem_handle, false)); |
+ if (!shared_buf->Map(buf_size)) { |
+ NOTREACHED() << "Map failed"; |
+ return NULL; |
+ } |
+ } else { |
+ NOTREACHED() << "Browser failed to allocate shared memory"; |
+ return NULL; |
+ } |
+ } else { |
+ NOTREACHED() << "Browser allocation request message failed"; |
+ return NULL; |
+ } |
+#endif |
+ return shared_buf.release(); |
+} |
+ |
ResourceDispatcher* ChildThread::resource_dispatcher() { |
return resource_dispatcher_.get(); |
} |