Index: ipc/ipc_channel_win.cc |
diff --git a/ipc/ipc_channel_win.cc b/ipc/ipc_channel_win.cc |
index 0e603195f3e23bf32765614c3b3595ee30f486f4..cff0f4b6752e91ce2e4b5d10dc5b49d79e66c06b 100644 |
--- a/ipc/ipc_channel_win.cc |
+++ b/ipc/ipc_channel_win.cc |
@@ -19,6 +19,7 @@ |
#include "base/win/scoped_handle.h" |
#include "ipc/ipc_listener.h" |
#include "ipc/ipc_logging.h" |
+#include "ipc/ipc_message_attachment_set.h" |
#include "ipc/ipc_message_utils.h" |
namespace IPC { |
@@ -81,12 +82,28 @@ void ChannelWin::Close() { |
} |
bool ChannelWin::Send(Message* message) { |
+ // TODO(erikchen): Remove this DCHECK once ChannelWin fully supports |
+ // brokerable attachments. http://crbug.com/493414. |
DCHECK(!message->HasAttachments()); |
DCHECK(thread_check_->CalledOnValidThread()); |
DVLOG(2) << "sending message @" << message << " on channel @" << this |
<< " with type " << message->type() |
<< " (" << output_queue_.size() << " in queue)"; |
+ // Sending a brokerable attachment requires a call to Channel::Send(), so |
+ // Send() may be re-entrant. Brokered attachments must be sent before the |
+ // Message itself. |
+ if (message->HasBrokerableAttachments()) { |
+ DCHECK(broker_); |
+ for (scoped_refptr<BrokerableAttachment> attachment : |
Tom Sepez
2015/06/19 18:04:11
Are we sure this doesn't do needless ref/dererf on
erikchen
2015/06/23 22:37:00
As per your later suggestion, I changed the interf
|
+ message->attachment_set()->PeekBrokerableAttachments()) { |
+ bool success = |
Tom Sepez
2015/06/19 18:04:11
nit: no need for local.
erikchen
2015/06/23 22:37:00
I've removed it.
|
+ broker_->SendAttachmentToProcess(attachment.get(), peer_pid_); |
Tom Sepez
2015/06/19 18:04:11
nit: local var not needed.
erikchen
2015/06/23 22:37:00
Done.
|
+ if (!success) |
+ return false; |
+ } |
+ } |
+ |
#ifdef IPC_MESSAGE_LOG_ENABLED |
Logging::GetInstance()->OnSendMessage(message, ""); |
#endif |