| Index: content/common/gpu/client/gpu_channel_host.cc
 | 
| ===================================================================
 | 
| --- content/common/gpu/client/gpu_channel_host.cc	(revision 166793)
 | 
| +++ content/common/gpu/client/gpu_channel_host.cc	(working copy)
 | 
| @@ -71,6 +71,18 @@
 | 
|    return gpu_info_;
 | 
|  }
 | 
|  
 | 
| +void GpuChannelHost::OnMessageReceived(const IPC::Message& message) {
 | 
| +    bool handled = true;
 | 
| +
 | 
| +    IPC_BEGIN_MESSAGE_MAP(GpuChannelHost, message)
 | 
| +      IPC_MESSAGE_HANDLER(GpuChannelMsg_GenerateMailboxNamesReply,
 | 
| +                          OnGenerateMailboxNamesReply)
 | 
| +    IPC_MESSAGE_UNHANDLED(handled = false)
 | 
| +    IPC_END_MESSAGE_MAP()
 | 
| +
 | 
| +    DCHECK(handled);
 | 
| +}
 | 
| +
 | 
|  void GpuChannelHost::OnChannelError() {
 | 
|    state_ = kLost;
 | 
|  
 | 
| @@ -246,9 +258,37 @@
 | 
|                                            std::vector<std::string>* names) {
 | 
|    TRACE_EVENT0("gpu", "GenerateMailboxName");
 | 
|    AutoLock lock(context_lock_);
 | 
| -  return Send(new GpuChannelMsg_GenerateMailboxNames(num, names));
 | 
| +
 | 
| +  if (num > mailbox_name_pool_.size()) {
 | 
| +    if (!Send(new GpuChannelMsg_GenerateMailboxNames(num, names)))
 | 
| +      return false;
 | 
| +  } else {
 | 
| +    names->insert(names->begin(),
 | 
| +                  mailbox_name_pool_.end() - num,
 | 
| +                  mailbox_name_pool_.end());
 | 
| +    mailbox_name_pool_.erase(mailbox_name_pool_.end() - num,
 | 
| +                             mailbox_name_pool_.end());
 | 
| +  }
 | 
| +
 | 
| +  const unsigned ideal_mailbox_pool_size = 100;
 | 
| +  if (mailbox_name_pool_.size() < ideal_mailbox_pool_size / 2) {
 | 
| +    Send(new GpuChannelMsg_GenerateMailboxNamesAsync(
 | 
| +        ideal_mailbox_pool_size - mailbox_name_pool_.size()));
 | 
| +  }
 | 
| +
 | 
| +  return true;
 | 
|  }
 | 
|  
 | 
| +void GpuChannelHost::OnGenerateMailboxNamesReply(
 | 
| +    const std::vector<std::string>& names) {
 | 
| +  TRACE_EVENT0("gpu", "OnGenerateMailboxNamesReply");
 | 
| +  AutoLock lock(context_lock_);
 | 
| +
 | 
| +  mailbox_name_pool_.insert(mailbox_name_pool_.end(),
 | 
| +                            names.begin(),
 | 
| +                            names.end());
 | 
| +}
 | 
| +
 | 
|  GpuChannelHost::~GpuChannelHost() {}
 | 
|  
 | 
|  
 | 
| @@ -280,11 +320,19 @@
 | 
|  bool GpuChannelHost::MessageFilter::OnMessageReceived(
 | 
|      const IPC::Message& message) {
 | 
|    DCHECK(parent_->factory_->IsIOThread());
 | 
| +
 | 
|    // Never handle sync message replies or we will deadlock here.
 | 
|    if (message.is_reply())
 | 
|      return false;
 | 
|  
 | 
| -  DCHECK(message.routing_id() != MSG_ROUTING_CONTROL);
 | 
| +  if (message.routing_id() == MSG_ROUTING_CONTROL) {
 | 
| +    MessageLoop* main_loop = parent_->factory_->GetMainLoop();
 | 
| +    main_loop->PostTask(FROM_HERE,
 | 
| +                        base::Bind(&GpuChannelHost::OnMessageReceived,
 | 
| +                                   parent_,
 | 
| +                                   message));
 | 
| +    return true;
 | 
| +  }
 | 
|  
 | 
|    ListenerMap::iterator it = listeners_.find(message.routing_id());
 | 
|  
 | 
| 
 |