Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(382)

Unified Diff: remoting/signaling/fake_signal_strategy.cc

Issue 414443009: Update ProtocolPerfTest to run host and client on different threads (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Created 6 years, 5 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « remoting/signaling/fake_signal_strategy.h ('k') | remoting/test/protocol_perftest.cc » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: remoting/signaling/fake_signal_strategy.cc
diff --git a/remoting/signaling/fake_signal_strategy.cc b/remoting/signaling/fake_signal_strategy.cc
index 8ce08c022c6c0340a65355d6efbae99ce4ff62f4..056f637d7c3134969b30ebb6b1b02e397ee6219c 100644
--- a/remoting/signaling/fake_signal_strategy.cc
+++ b/remoting/signaling/fake_signal_strategy.cc
@@ -19,13 +19,15 @@ namespace remoting {
// static
void FakeSignalStrategy::Connect(FakeSignalStrategy* peer1,
FakeSignalStrategy* peer2) {
- peer1->peer_ = peer2;
- peer2->peer_ = peer1;
+ DCHECK(peer1->main_thread_->BelongsToCurrentThread());
+ DCHECK(peer2->main_thread_->BelongsToCurrentThread());
+ peer1->ConnectTo(peer2);
+ peer2->ConnectTo(peer1);
}
FakeSignalStrategy::FakeSignalStrategy(const std::string& jid)
- : jid_(jid),
- peer_(NULL),
+ : main_thread_(base::ThreadTaskRunnerHandle::Get()),
+ jid_(jid),
last_id_(0),
weak_factory_(this) {
@@ -38,6 +40,22 @@ FakeSignalStrategy::~FakeSignalStrategy() {
}
}
+void FakeSignalStrategy::ConnectTo(FakeSignalStrategy* peer) {
+ PeerCallback peer_callback =
+ base::Bind(&FakeSignalStrategy::DeliverMessageOnThread,
+ main_thread_,
+ weak_factory_.GetWeakPtr());
+ if (peer->main_thread_->BelongsToCurrentThread()) {
+ peer->SetPeerCallback(peer_callback);
+ } else {
+ peer->main_thread_->PostTask(
+ FROM_HERE,
+ base::Bind(&FakeSignalStrategy::SetPeerCallback,
+ base::Unretained(peer),
+ peer_callback));
+ }
+}
+
void FakeSignalStrategy::Connect() {
DCHECK(CalledOnValidThread());
FOR_EACH_OBSERVER(Listener, listeners_,
@@ -78,8 +96,8 @@ bool FakeSignalStrategy::SendStanza(scoped_ptr<buzz::XmlElement> stanza) {
stanza->SetAttr(buzz::QN_FROM, jid_);
- if (peer_) {
- peer_->OnIncomingMessage(stanza.Pass());
+ if (!peer_callback_.is_null()) {
+ peer_callback_.Run(stanza.Pass());
return true;
} else {
return false;
@@ -91,35 +109,39 @@ std::string FakeSignalStrategy::GetNextId() {
return base::IntToString(last_id_);
}
+// static
+void FakeSignalStrategy::DeliverMessageOnThread(
+ scoped_refptr<base::SingleThreadTaskRunner> thread,
+ base::WeakPtr<FakeSignalStrategy> target,
+ scoped_ptr<buzz::XmlElement> stanza) {
+ thread->PostTask(FROM_HERE,
+ base::Bind(&FakeSignalStrategy::OnIncomingMessage,
+ target, base::Passed(&stanza)));
+}
+
void FakeSignalStrategy::OnIncomingMessage(
scoped_ptr<buzz::XmlElement> stanza) {
- pending_messages_.push(stanza.get());
+ buzz::XmlElement* stanza_ptr = stanza.get();
rmsousa 2014/07/23 00:49:37 nit: DCHECK current thread?
Sergey Ulanov 2014/07/25 18:23:15 Done.
received_messages_.push_back(stanza.release());
- base::ThreadTaskRunnerHandle::Get()->PostTask(
- FROM_HERE, base::Bind(&FakeSignalStrategy::DeliverIncomingMessages,
- weak_factory_.GetWeakPtr()));
-}
-
-void FakeSignalStrategy::DeliverIncomingMessages() {
- while (!pending_messages_.empty()) {
- buzz::XmlElement* stanza = pending_messages_.front();
- const std::string& to_field = stanza->Attr(buzz::QN_TO);
- if (to_field != jid_) {
- LOG(WARNING) << "Dropping stanza that is addressed to " << to_field
- << ". Local jid: " << jid_
- << ". Message content: " << stanza->Str();
- return;
- }
-
- ObserverListBase<Listener>::Iterator it(listeners_);
- Listener* listener;
- while ((listener = it.GetNext()) != NULL) {
- if (listener->OnSignalStrategyIncomingStanza(stanza))
- break;
- }
-
- pending_messages_.pop();
+
+ const std::string& to_field = stanza_ptr->Attr(buzz::QN_TO);
+ if (to_field != jid_) {
+ LOG(WARNING) << "Dropping stanza that is addressed to " << to_field
+ << ". Local jid: " << jid_
+ << ". Message content: " << stanza_ptr->Str();
+ return;
+ }
+
+ ObserverListBase<Listener>::Iterator it(listeners_);
+ Listener* listener;
+ while ((listener = it.GetNext()) != NULL) {
+ if (listener->OnSignalStrategyIncomingStanza(stanza_ptr))
+ break;
}
}
+void FakeSignalStrategy::SetPeerCallback(const PeerCallback& peer_callback) {
+ peer_callback_ = peer_callback;
+}
+
} // namespace remoting
« no previous file with comments | « remoting/signaling/fake_signal_strategy.h ('k') | remoting/test/protocol_perftest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698