summaryrefslogtreecommitdiffstats
path: root/chrome/browser/renderer_host/render_widget_helper.cc
diff options
context:
space:
mode:
Diffstat (limited to 'chrome/browser/renderer_host/render_widget_helper.cc')
-rw-r--r--chrome/browser/renderer_host/render_widget_helper.cc59
1 files changed, 59 insertions, 0 deletions
diff --git a/chrome/browser/renderer_host/render_widget_helper.cc b/chrome/browser/renderer_host/render_widget_helper.cc
index a03bb1b..715a85b 100644
--- a/chrome/browser/renderer_host/render_widget_helper.cc
+++ b/chrome/browser/renderer_host/render_widget_helper.cc
@@ -56,6 +56,10 @@ RenderWidgetHelper::~RenderWidgetHelper() {
// The elements of pending_paints_ each hold an owning reference back to this
// object, so we should not be destroyed unless pending_paints_ is empty!
DCHECK(pending_paints_.empty());
+
+#if defined(OS_MACOSX)
+ ClearAllocatedDIBs();
+#endif
}
int RenderWidgetHelper::GetNextRoutingID() {
@@ -244,3 +248,58 @@ void RenderWidgetHelper::OnSimulateReceivedMessage(
if (host)
host->OnMessageReceived(message);
}
+
+#if defined(OS_MACOSX)
+TransportDIB* RenderWidgetHelper::MapTransportDIB(TransportDIB::Id dib_id) {
+ AutoLock locked(allocated_dibs_lock_);
+
+ const std::map<TransportDIB::Id, int>::iterator
+ i = allocated_dibs_.find(dib_id);
+ if (i == allocated_dibs_.end())
+ return NULL;
+
+ base::FileDescriptor fd(dup(i->second), true);
+ return TransportDIB::Map(fd);
+}
+
+void RenderWidgetHelper::AllocTransportDIB(
+ size_t size, IPC::Maybe<TransportDIB::Handle>* result) {
+ base::SharedMemory* shared_memory = new base::SharedMemory();
+ if (!shared_memory->Create(L"", false /* read write */,
+ false /* do not open existing */, size)) {
+ result->valid = false;
+ delete shared_memory;
+ return;
+ }
+
+ result->valid = true;
+ shared_memory->GiveToProcess(0 /* pid, not needed */, &result->value);
+
+ // Keep a copy of the file descriptor around
+ AutoLock locked(allocated_dibs_lock_);
+ allocated_dibs_[shared_memory->id()] = dup(result->value.fd);
+}
+
+void RenderWidgetHelper::FreeTransportDIB(TransportDIB::Id dib_id) {
+ AutoLock locked(allocated_dibs_lock_);
+
+ const std::map<TransportDIB::Id, int>::iterator
+ i = allocated_dibs_.find(dib_id);
+
+ if (i != allocated_dibs_.end()) {
+ close(i->second);
+ allocated_dibs_.erase(i);
+ } else {
+ DLOG(WARNING) << "Renderer asked us to free unknown transport DIB";
+ }
+}
+
+void RenderWidgetHelper::ClearAllocatedDIBs() {
+ for (std::map<TransportDIB::Id, int>::iterator
+ i = allocated_dibs_.begin(); i != allocated_dibs_.end(); ++i) {
+ close(i->second);
+ }
+
+ allocated_dibs_.clear();
+}
+#endif