| OLD | NEW |
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "ipc/ipc_sync_message_filter.h" | 5 #include "ipc/ipc_sync_message_filter.h" |
| 6 | 6 |
| 7 #include "base/bind.h" | 7 #include "base/bind.h" |
| 8 #include "base/location.h" | 8 #include "base/location.h" |
| 9 #include "base/logging.h" | 9 #include "base/logging.h" |
| 10 #include "base/single_thread_task_runner.h" | 10 #include "base/single_thread_task_runner.h" |
| (...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 64 { | 64 { |
| 65 base::AutoLock auto_lock(lock_); | 65 base::AutoLock auto_lock(lock_); |
| 66 delete pending_message.deserializer; | 66 delete pending_message.deserializer; |
| 67 pending_sync_messages_.erase(&pending_message); | 67 pending_sync_messages_.erase(&pending_message); |
| 68 } | 68 } |
| 69 | 69 |
| 70 return pending_message.send_result; | 70 return pending_message.send_result; |
| 71 } | 71 } |
| 72 | 72 |
| 73 void SyncMessageFilter::OnFilterAdded(Sender* sender) { | 73 void SyncMessageFilter::OnFilterAdded(Sender* sender) { |
| 74 sender_ = sender; | |
| 75 std::vector<Message*> pending_messages; | 74 std::vector<Message*> pending_messages; |
| 76 { | 75 { |
| 77 base::AutoLock auto_lock(lock_); | 76 base::AutoLock auto_lock(lock_); |
| 77 sender_ = sender; |
| 78 io_task_runner_ = base::ThreadTaskRunnerHandle::Get(); | 78 io_task_runner_ = base::ThreadTaskRunnerHandle::Get(); |
| 79 pending_messages_.release(&pending_messages); | 79 pending_messages_.release(&pending_messages); |
| 80 } | 80 } |
| 81 for (auto* msg : pending_messages) | 81 for (auto* msg : pending_messages) |
| 82 SendOnIOThread(msg); | 82 SendOnIOThread(msg); |
| 83 } | 83 } |
| 84 | 84 |
| 85 void SyncMessageFilter::OnChannelError() { | 85 void SyncMessageFilter::OnChannelError() { |
| 86 base::AutoLock auto_lock(lock_); |
| 86 sender_ = NULL; | 87 sender_ = NULL; |
| 87 SignalAllEvents(); | 88 SignalAllEvents(); |
| 88 } | 89 } |
| 89 | 90 |
| 90 void SyncMessageFilter::OnChannelClosing() { | 91 void SyncMessageFilter::OnChannelClosing() { |
| 92 base::AutoLock auto_lock(lock_); |
| 91 sender_ = NULL; | 93 sender_ = NULL; |
| 92 SignalAllEvents(); | 94 SignalAllEvents(); |
| 93 } | 95 } |
| 94 | 96 |
| 95 bool SyncMessageFilter::OnMessageReceived(const Message& message) { | 97 bool SyncMessageFilter::OnMessageReceived(const Message& message) { |
| 96 base::AutoLock auto_lock(lock_); | 98 base::AutoLock auto_lock(lock_); |
| 97 for (PendingSyncMessages::iterator iter = pending_sync_messages_.begin(); | 99 for (PendingSyncMessages::iterator iter = pending_sync_messages_.begin(); |
| 98 iter != pending_sync_messages_.end(); ++iter) { | 100 iter != pending_sync_messages_.end(); ++iter) { |
| 99 if (SyncMessage::IsMessageReplyTo(message, (*iter)->id)) { | 101 if (SyncMessage::IsMessageReplyTo(message, (*iter)->id)) { |
| 100 if (!message.is_reply_error()) { | 102 if (!message.is_reply_error()) { |
| (...skipping 21 matching lines...) Expand all Loading... |
| 122 | 124 |
| 123 void SyncMessageFilter::SendOnIOThread(Message* message) { | 125 void SyncMessageFilter::SendOnIOThread(Message* message) { |
| 124 if (sender_) { | 126 if (sender_) { |
| 125 sender_->Send(message); | 127 sender_->Send(message); |
| 126 return; | 128 return; |
| 127 } | 129 } |
| 128 | 130 |
| 129 if (message->is_sync()) { | 131 if (message->is_sync()) { |
| 130 // We don't know which thread sent it, but it doesn't matter, just signal | 132 // We don't know which thread sent it, but it doesn't matter, just signal |
| 131 // them all. | 133 // them all. |
| 134 base::AutoLock auto_lock(lock_); |
| 132 SignalAllEvents(); | 135 SignalAllEvents(); |
| 133 } | 136 } |
| 134 | 137 |
| 135 delete message; | 138 delete message; |
| 136 } | 139 } |
| 137 | 140 |
| 138 void SyncMessageFilter::SignalAllEvents() { | 141 void SyncMessageFilter::SignalAllEvents() { |
| 139 base::AutoLock auto_lock(lock_); | 142 lock_.AssertAcquired(); |
| 140 for (PendingSyncMessages::iterator iter = pending_sync_messages_.begin(); | 143 for (PendingSyncMessages::iterator iter = pending_sync_messages_.begin(); |
| 141 iter != pending_sync_messages_.end(); ++iter) { | 144 iter != pending_sync_messages_.end(); ++iter) { |
| 142 (*iter)->done_event->Signal(); | 145 (*iter)->done_event->Signal(); |
| 143 } | 146 } |
| 144 } | 147 } |
| 145 | 148 |
| 146 } // namespace IPC | 149 } // namespace IPC |
| OLD | NEW |