Index: webrtc/p2p/base/transport.cc |
diff --git a/webrtc/p2p/base/transport.cc b/webrtc/p2p/base/transport.cc |
index 0184af3dab977bf150e836a0999d3368b0b10986..5c690f7988c4f93a1dbef54eb3c72fe2bf15e403 100644 |
--- a/webrtc/p2p/base/transport.cc |
+++ b/webrtc/p2p/base/transport.cc |
@@ -35,6 +35,7 @@ enum { |
MSG_ROLECONFLICT, |
MSG_COMPLETED, |
MSG_FAILED, |
+ MSG_FLAKYSTATE, |
}; |
struct ChannelParams : public rtc::MessageData { |
@@ -128,6 +129,7 @@ Transport::Transport(rtc::Thread* signaling_thread, |
destroyed_(false), |
readable_(TRANSPORT_STATE_NONE), |
writable_(TRANSPORT_STATE_NONE), |
+ flaky_(TRANSPORT_STATE_NONE), |
was_writable_(false), |
connect_requested_(false), |
ice_role_(ICEROLE_UNKNOWN), |
@@ -242,6 +244,7 @@ TransportChannelImpl* Transport::CreateChannel_w(int component) { |
impl->SignalReadableState.connect(this, &Transport::OnChannelReadableState); |
impl->SignalWritableState.connect(this, &Transport::OnChannelWritableState); |
+ impl->SignalFlakyState.connect(this, &Transport::OnChannelFlakyState); |
impl->SignalRequestSignaling.connect( |
this, &Transport::OnChannelRequestSignaling); |
impl->SignalCandidateReady.connect(this, &Transport::OnChannelCandidateReady); |
@@ -501,7 +504,7 @@ void Transport::OnChannelReadableState(TransportChannel* channel) { |
void Transport::OnChannelReadableState_s() { |
ASSERT(signaling_thread()->IsCurrent()); |
- TransportState readable = GetTransportState_s(true); |
+ TransportState readable = GetTransportState_s(TRANSPORT_READABLE); |
if (readable_ != readable) { |
readable_ = readable; |
SignalReadableState(this); |
@@ -517,7 +520,7 @@ void Transport::OnChannelWritableState(TransportChannel* channel) { |
void Transport::OnChannelWritableState_s() { |
ASSERT(signaling_thread()->IsCurrent()); |
- TransportState writable = GetTransportState_s(false); |
+ TransportState writable = GetTransportState_s(TRANSPORT_WRITABLE); |
if (writable_ != writable) { |
was_writable_ = (writable_ == TRANSPORT_STATE_ALL); |
writable_ = writable; |
@@ -525,15 +528,41 @@ void Transport::OnChannelWritableState_s() { |
} |
} |
-TransportState Transport::GetTransportState_s(bool read) { |
+void Transport::OnChannelFlakyState(TransportChannel* channel) { |
+ ASSERT(worker_thread()->IsCurrent()); |
+ signaling_thread()->Post(this, MSG_FLAKYSTATE); |
+} |
+ |
+void Transport::OnChannelFlakyState_s() { |
+ ASSERT(signaling_thread()->IsCurrent()); |
+ TransportState flaky = GetTransportState_s(TRANSPORT_FLAKY); |
+ if (flaky_ != flaky) { |
+ flaky_ = flaky; |
+ SignalFlakyState(this); |
+ } |
+} |
+ |
+TransportState Transport::GetTransportState_s(TransportOperation operation) { |
ASSERT(signaling_thread()->IsCurrent()); |
rtc::CritScope cs(&crit_); |
bool any = false; |
bool all = !channels_.empty(); |
for (const auto iter : channels_) { |
- bool b = (read ? iter.second->readable() : |
- iter.second->writable()); |
+ bool b = false; |
+ switch (operation) { |
+ case TRANSPORT_READABLE: |
+ b = iter.second->readable(); |
+ break; |
+ case TRANSPORT_WRITABLE: |
+ b = iter.second->writable(); |
+ break; |
+ case TRANSPORT_FLAKY: |
+ b = iter.second->flaky(); |
+ break; |
+ default: |
+ ASSERT(false); |
+ } |
any |= b; |
all &= b; |
} |
@@ -900,6 +929,9 @@ void Transport::OnMessage(rtc::Message* msg) { |
case MSG_WRITESTATE: |
OnChannelWritableState_s(); |
break; |
+ case MSG_FLAKYSTATE: |
+ OnChannelFlakyState_s(); |
+ break; |
case MSG_REQUESTSIGNALING: |
OnChannelRequestSignaling_s(); |
break; |