| Index: chrome/browser/renderer_host/render_widget_helper.cc
|
| diff --git a/chrome/browser/renderer_host/render_widget_helper.cc b/chrome/browser/renderer_host/render_widget_helper.cc
|
| index a03bb1b78ebf46edb2cf03818cd7733b80ac9867..715a85bb874ef6bbe7f5be2087435ab658c64bff 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
|
|
|