Chromium Code Reviews| Index: components/nacl/loader/nacl_ipc_adapter.cc |
| diff --git a/components/nacl/loader/nacl_ipc_adapter.cc b/components/nacl/loader/nacl_ipc_adapter.cc |
| index 5d28152366e62b93b8ea2b68b371a675442ff809..1ce10089ae7ba8eb4be24230c83c4db8c1919d4f 100644 |
| --- a/components/nacl/loader/nacl_ipc_adapter.cc |
| +++ b/components/nacl/loader/nacl_ipc_adapter.cc |
| @@ -628,6 +628,14 @@ scoped_ptr<IPC::Message> CreateOpenResourceReply( |
| void NaClIPCAdapter::OnFileTokenResolved(const IPC::Message& orig_msg, |
| IPC::PlatformFileForTransit ipc_fd, |
| base::FilePath file_path) { |
| + base::AutoLock lock(lock_); |
| + OnFileTokenResolvedLocked(orig_msg, ipc_fd, file_path); |
| +} |
| + |
| +void NaClIPCAdapter::OnFileTokenResolvedLocked( |
| + const IPC::Message& orig_msg, |
| + IPC::PlatformFileForTransit ipc_fd, |
| + base::FilePath file_path) { |
| // The path where an invalid ipc_fd is returned isn't currently |
| // covered by any tests. |
| if (ipc_fd == IPC::InvalidPlatformFileForTransit()) { |
| @@ -653,11 +661,8 @@ void NaClIPCAdapter::OnFileTokenResolved(const IPC::Message& orig_msg, |
| scoped_refptr<RewrittenMessage> rewritten_msg(new RewrittenMessage); |
| rewritten_msg->AddDescriptor(desc_wrapper.release()); |
| - { |
| - base::AutoLock lock(lock_); |
| - SaveMessage(*new_msg, rewritten_msg.get()); |
| - cond_var_.Signal(); |
| - } |
| + SaveMessage(*new_msg, rewritten_msg.get()); |
|
teravest
2014/11/19 15:59:30
I don't like that the critical section is made lar
Yusuke Sato
2014/11/20 00:30:27
Done.
|
| + cond_var_.Signal(); |
| return; |
| } |
| @@ -692,11 +697,8 @@ void NaClIPCAdapter::OnFileTokenResolved(const IPC::Message& orig_msg, |
| scoped_refptr<RewrittenMessage> rewritten_msg(new RewrittenMessage); |
| rewritten_msg->AddDescriptor(desc_wrapper.release()); |
| - { |
| - base::AutoLock lock(lock_); |
| - SaveMessage(*new_msg, rewritten_msg.get()); |
| - cond_var_.Signal(); |
| - } |
| + SaveMessage(*new_msg, rewritten_msg.get()); |
| + cond_var_.Signal(); |
| } |
| void NaClIPCAdapter::OnChannelConnected(int32 peer_pid) { |
| @@ -777,6 +779,21 @@ bool NaClIPCAdapter::SendCompleteMessage(const char* buffer, |
| if (new_msg) |
| msg.reset(new_msg.release()); |
| + // Handle PpapiHostMsg_OpenResource locally without sending an IPC to the |
| + // renderer when possible. |
| + PpapiHostMsg_OpenResource::Schema::SendParam send_params; |
| + if (!open_resource_cb_.is_null() && |
| + (msg->type() == PpapiHostMsg_OpenResource::ID) && |
| + PpapiHostMsg_OpenResource::ReadSendParam(msg.get(), &send_params)) { |
| + const std::string key = send_params.a; |
| + if (open_resource_cb_.Run( |
| + *msg.get(), key, |
| + base::Bind(&NaClIPCAdapter::OnFileTokenResolvedLocked, this))) { |
| + // The callback sent a reply to the untrusted side. |
| + return true; |
| + } |
| + } |
| + |
| // Actual send must be done on the I/O thread. |
| task_runner_->PostTask(FROM_HERE, |
| base::Bind(&NaClIPCAdapter::SendMessageOnIOThread, this, |