Chromium Code Reviews| Index: ipc/ipc_channel_proxy.cc |
| diff --git a/ipc/ipc_channel_proxy.cc b/ipc/ipc_channel_proxy.cc |
| index b3424124158d5034c5cd142c8779a81c17c83923..36493881e884948cad86b38c9103c16fd98865c7 100644 |
| --- a/ipc/ipc_channel_proxy.cc |
| +++ b/ipc/ipc_channel_proxy.cc |
| @@ -318,23 +318,20 @@ void ChannelProxy::Context::ClearChannel() { |
| channel_.reset(); |
| } |
| -void ChannelProxy::Context::SendFromThisThread(Message* message) { |
| - base::AutoLock l(channel_lifetime_lock_); |
| - if (!channel_) |
| - return; |
|
Ken Rockot(use gerrit already)
2016/05/20 02:17:19
Heh, looks like this leaked before. Though it was
|
| - DCHECK(channel_->IsSendThreadSafe()); |
| - channel_->Send(message); |
| -} |
| - |
| -void ChannelProxy::Context::Send(Message* message) { |
| - if (channel_send_thread_safe_) { |
| - SendFromThisThread(message); |
| - return; |
| +bool ChannelProxy::Context::Send(std::unique_ptr<Message> message, |
| + bool force_io_thread) { |
| + if (channel_send_thread_safe_ && !force_io_thread) { |
| + base::AutoLock l(channel_lifetime_lock_); |
| + if (!channel_) |
| + return false; |
| + DCHECK(channel_->IsSendThreadSafe()); |
| + return channel_->Send(message.release()); |
| } |
| ipc_task_runner()->PostTask( |
| FROM_HERE, base::Bind(&ChannelProxy::Context::OnSendMessage, this, |
| - base::Passed(base::WrapUnique(message)))); |
| + base::Passed(&message))); |
| + return true; |
| } |
| bool ChannelProxy::Context::IsChannelSendThreadSafe() const { |
| @@ -377,11 +374,7 @@ ChannelProxy::ChannelProxy(Context* context) |
| ChannelProxy::ChannelProxy( |
| Listener* listener, |
| const scoped_refptr<base::SingleThreadTaskRunner>& ipc_task_runner) |
| - : context_(new Context(listener, ipc_task_runner)), did_init_(false) { |
| -#if defined(ENABLE_IPC_FUZZER) |
| - outgoing_message_filter_ = NULL; |
| -#endif |
| -} |
| + : ChannelProxy(new Context(listener, ipc_task_runner)) {} |
| ChannelProxy::~ChannelProxy() { |
| DCHECK(CalledOnValidThread()); |
| @@ -444,25 +437,15 @@ void ChannelProxy::Close() { |
| } |
| bool ChannelProxy::Send(Message* message) { |
| - DCHECK(did_init_); |
| - |
| - // TODO(alexeypa): add DCHECK(CalledOnValidThread()) here. Currently there are |
| - // tests that call Send() from a wrong thread. See http://crbug.com/163523. |
| - |
| -#ifdef ENABLE_IPC_FUZZER |
| - // In IPC fuzzing builds, it is possible to define a filter to apply to |
| - // outgoing messages. It will either rewrite the message and return a new |
| - // one, freeing the original, or return the message unchanged. |
| - if (outgoing_message_filter()) |
| - message = outgoing_message_filter()->Rewrite(message); |
| -#endif |
| + return SendOnIPCThread(base::WrapUnique(message)); |
| +} |
| -#ifdef IPC_MESSAGE_LOG_ENABLED |
| - Logging::GetInstance()->OnSendMessage(message, context_->channel_id()); |
| -#endif |
| +bool ChannelProxy::SendNow(std::unique_ptr<Message> message) { |
| + return SendImpl(std::move(message), false /* force_io_thread */); |
| +} |
| - context_->Send(message); |
| - return true; |
| +bool ChannelProxy::SendOnIPCThread(std::unique_ptr<Message> message) { |
| + return SendImpl(std::move(message), true /* force_io_thread */); |
| } |
| void ChannelProxy::AddFilter(MessageFilter* filter) { |
| @@ -519,6 +502,28 @@ base::ScopedFD ChannelProxy::TakeClientFileDescriptor() { |
| void ChannelProxy::OnChannelInit() { |
| } |
| +bool ChannelProxy::SendImpl(std::unique_ptr<Message> message, |
| + bool force_io_thread) { |
| + DCHECK(did_init_); |
| + |
| + // TODO(alexeypa): add DCHECK(CalledOnValidThread()) here. Currently there are |
| + // tests that call Send() from a wrong thread. See http://crbug.com/163523. |
| + |
| +#ifdef ENABLE_IPC_FUZZER |
| + // In IPC fuzzing builds, it is possible to define a filter to apply to |
| + // outgoing messages. It will either rewrite the message and return a new |
| + // one, freeing the original, or return the message unchanged. |
| + if (outgoing_message_filter()) |
| + message.reset(outgoing_message_filter()->Rewrite(message.release())); |
| +#endif |
| + |
| +#ifdef IPC_MESSAGE_LOG_ENABLED |
| + Logging::GetInstance()->OnSendMessage(message.get(), context_->channel_id()); |
| +#endif |
| + |
| + return context_->Send(std::move(message), force_io_thread); |
| +} |
| + |
| //----------------------------------------------------------------------------- |
| } // namespace IPC |