Cleanup SocketMonitor a little so that it can handle a change in transport channel. And cleanup some names and style and such as well.
This is a part of the big BUNDLE implementation at https://webrtc-codereview.appspot.com/45519004/
R=guoweis@webrtc.org
Review URL: https://webrtc-codereview.appspot.com/49399004
Cr-Commit-Position: refs/heads/master@{#8720}
git-svn-id: http://webrtc.googlecode.com/svn/trunk@8720 4adac7df-926f-26a2-2b94-8c16560cd09d
diff --git a/talk/app/webrtc/webrtcsession_unittest.cc b/talk/app/webrtc/webrtcsession_unittest.cc
index 6bfa17e..ab711ed 100644
--- a/talk/app/webrtc/webrtcsession_unittest.cc
+++ b/talk/app/webrtc/webrtcsession_unittest.cc
@@ -43,6 +43,7 @@
#include "webrtc/p2p/base/stunserver.h"
#include "webrtc/p2p/base/teststunserver.h"
#include "webrtc/p2p/base/testturnserver.h"
+#include "webrtc/p2p/base/transportchannel.h"
#include "webrtc/p2p/client/basicportallocator.h"
#include "talk/session/media/channelmanager.h"
#include "talk/session/media/mediasession.h"
diff --git a/talk/session/media/channel.cc b/talk/session/media/channel.cc
index 1ea70e4..025a6ad 100644
--- a/talk/session/media/channel.cc
+++ b/talk/session/media/channel.cc
@@ -278,21 +278,28 @@
}
void BaseChannel::StartConnectionMonitor(int cms) {
- socket_monitor_.reset(new SocketMonitor(transport_channel_,
- worker_thread(),
- rtc::Thread::Current()));
- socket_monitor_->SignalUpdate.connect(
+ // We pass in the BaseChannel instead of the transport_channel_
+ // because if the transport_channel_ changes, the ConnectionMonitor
+ // would be pointing to the wrong TransportChannel.
+ connection_monitor_.reset(new ConnectionMonitor(
+ this, worker_thread(), rtc::Thread::Current()));
+ connection_monitor_->SignalUpdate.connect(
this, &BaseChannel::OnConnectionMonitorUpdate);
- socket_monitor_->Start(cms);
+ connection_monitor_->Start(cms);
}
void BaseChannel::StopConnectionMonitor() {
- if (socket_monitor_) {
- socket_monitor_->Stop();
- socket_monitor_.reset();
+ if (connection_monitor_) {
+ connection_monitor_->Stop();
+ connection_monitor_.reset();
}
}
+bool BaseChannel::GetConnectionStats(ConnectionInfos* infos) {
+ ASSERT(worker_thread_ == rtc::Thread::Current());
+ return transport_channel_->GetStats(infos);
+}
+
void BaseChannel::set_rtcp_transport_channel(TransportChannel* channel) {
if (rtcp_transport_channel_ != channel) {
if (rtcp_transport_channel_) {
@@ -1597,7 +1604,7 @@
}
void VoiceChannel::OnConnectionMonitorUpdate(
- SocketMonitor* monitor, const std::vector<ConnectionInfo>& infos) {
+ ConnectionMonitor* monitor, const std::vector<ConnectionInfo>& infos) {
SignalConnectionMonitor(this, infos);
}
@@ -2003,7 +2010,7 @@
}
void VideoChannel::OnConnectionMonitorUpdate(
- SocketMonitor *monitor, const std::vector<ConnectionInfo> &infos) {
+ ConnectionMonitor* monitor, const std::vector<ConnectionInfo> &infos) {
SignalConnectionMonitor(this, infos);
}
@@ -2372,7 +2379,7 @@
}
void DataChannel::OnConnectionMonitorUpdate(
- SocketMonitor* monitor, const std::vector<ConnectionInfo>& infos) {
+ ConnectionMonitor* monitor, const std::vector<ConnectionInfo>& infos) {
SignalConnectionMonitor(this, infos);
}
diff --git a/talk/session/media/channel.h b/talk/session/media/channel.h
index 6256b35..bb88c2f 100644
--- a/talk/session/media/channel.h
+++ b/talk/session/media/channel.h
@@ -73,7 +73,8 @@
class BaseChannel
: public rtc::MessageHandler, public sigslot::has_slots<>,
- public MediaChannel::NetworkInterface {
+ public MediaChannel::NetworkInterface,
+ public ConnectionStatsGetter {
public:
BaseChannel(rtc::Thread* thread, MediaEngineInterface* media_engine,
MediaChannel* channel, BaseSession* session,
@@ -130,6 +131,8 @@
// Monitoring
void StartConnectionMonitor(int cms);
void StopConnectionMonitor();
+ // For ConnectionStatsGetter, used by ConnectionMonitor
+ virtual bool GetConnectionStats(ConnectionInfos* infos) override;
void set_srtp_signal_silent_time(uint32 silent_time) {
srtp_filter_.set_signal_silent_time(silent_time);
@@ -339,7 +342,7 @@
// Handled in derived classes
// Get the SRTP ciphers to use for RTP media
virtual void GetSrtpCiphers(std::vector<std::string>* ciphers) const = 0;
- virtual void OnConnectionMonitorUpdate(SocketMonitor* monitor,
+ virtual void OnConnectionMonitorUpdate(ConnectionMonitor* monitor,
const std::vector<ConnectionInfo>& infos) = 0;
// Helper function for invoking bool-returning methods on the worker thread.
@@ -370,7 +373,7 @@
SrtpFilter srtp_filter_;
RtcpMuxFilter rtcp_mux_filter_;
BundleFilter bundle_filter_;
- rtc::scoped_ptr<SocketMonitor> socket_monitor_;
+ rtc::scoped_ptr<ConnectionMonitor> connection_monitor_;
bool enabled_;
bool writable_;
bool rtp_ready_to_send_;
@@ -480,7 +483,7 @@
virtual void OnMessage(rtc::Message* pmsg);
virtual void GetSrtpCiphers(std::vector<std::string>* ciphers) const;
virtual void OnConnectionMonitorUpdate(
- SocketMonitor* monitor, const std::vector<ConnectionInfo>& infos);
+ ConnectionMonitor* monitor, const std::vector<ConnectionInfo>& infos);
virtual void OnMediaMonitorUpdate(
VoiceMediaChannel* media_channel, const VoiceMediaInfo& info);
void OnAudioMonitorUpdate(AudioMonitor* monitor, const AudioInfo& info);
@@ -569,7 +572,7 @@
virtual void OnMessage(rtc::Message* pmsg);
virtual void GetSrtpCiphers(std::vector<std::string>* ciphers) const;
virtual void OnConnectionMonitorUpdate(
- SocketMonitor* monitor, const std::vector<ConnectionInfo>& infos);
+ ConnectionMonitor* monitor, const std::vector<ConnectionInfo>& infos);
virtual void OnMediaMonitorUpdate(
VideoMediaChannel* media_channel, const VideoMediaInfo& info);
virtual void OnScreencastWindowEvent(uint32 ssrc,
@@ -688,7 +691,7 @@
virtual void OnMessage(rtc::Message* pmsg);
virtual void GetSrtpCiphers(std::vector<std::string>* ciphers) const;
virtual void OnConnectionMonitorUpdate(
- SocketMonitor* monitor, const std::vector<ConnectionInfo>& infos);
+ ConnectionMonitor* monitor, const std::vector<ConnectionInfo>& infos);
virtual void OnMediaMonitorUpdate(
DataMediaChannel* media_channel, const DataMediaInfo& info);
virtual bool ShouldSetupDtlsSrtp() const;
diff --git a/webrtc/p2p/client/socketmonitor.cc b/webrtc/p2p/client/socketmonitor.cc
index 5245535..cc48c01 100644
--- a/webrtc/p2p/client/socketmonitor.cc
+++ b/webrtc/p2p/client/socketmonitor.cc
@@ -21,53 +21,53 @@
MSG_MONITOR_SIGNAL
};
-SocketMonitor::SocketMonitor(TransportChannel* channel,
- rtc::Thread* worker_thread,
- rtc::Thread* monitor_thread) {
- channel_ = channel;
- channel_thread_ = worker_thread;
- monitoring_thread_ = monitor_thread;
+ConnectionMonitor::ConnectionMonitor(ConnectionStatsGetter* stats_getter,
+ rtc::Thread* worker_thread,
+ rtc::Thread* monitoring_thread) {
+ stats_getter_ = stats_getter;
+ worker_thread_ = worker_thread;
+ monitoring_thread_ = monitoring_thread;
monitoring_ = false;
}
-SocketMonitor::~SocketMonitor() {
- channel_thread_->Clear(this);
+ConnectionMonitor::~ConnectionMonitor() {
+ worker_thread_->Clear(this);
monitoring_thread_->Clear(this);
}
-void SocketMonitor::Start(int milliseconds) {
+void ConnectionMonitor::Start(int milliseconds) {
rate_ = milliseconds;
if (rate_ < 250)
rate_ = 250;
- channel_thread_->Post(this, MSG_MONITOR_START);
+ worker_thread_->Post(this, MSG_MONITOR_START);
}
-void SocketMonitor::Stop() {
- channel_thread_->Post(this, MSG_MONITOR_STOP);
+void ConnectionMonitor::Stop() {
+ worker_thread_->Post(this, MSG_MONITOR_STOP);
}
-void SocketMonitor::OnMessage(rtc::Message *message) {
+void ConnectionMonitor::OnMessage(rtc::Message *message) {
rtc::CritScope cs(&crit_);
switch (message->message_id) {
case MSG_MONITOR_START:
- ASSERT(rtc::Thread::Current() == channel_thread_);
+ ASSERT(rtc::Thread::Current() == worker_thread_);
if (!monitoring_) {
monitoring_ = true;
- PollSocket(true);
+ PollConnectionStats_w();
}
break;
case MSG_MONITOR_STOP:
- ASSERT(rtc::Thread::Current() == channel_thread_);
+ ASSERT(rtc::Thread::Current() == worker_thread_);
if (monitoring_) {
monitoring_ = false;
- channel_thread_->Clear(this);
+ worker_thread_->Clear(this);
}
break;
case MSG_MONITOR_POLL:
- ASSERT(rtc::Thread::Current() == channel_thread_);
- PollSocket(true);
+ ASSERT(rtc::Thread::Current() == worker_thread_);
+ PollConnectionStats_w();
break;
case MSG_MONITOR_SIGNAL: {
@@ -81,17 +81,16 @@
}
}
-void SocketMonitor::PollSocket(bool poll) {
- ASSERT(rtc::Thread::Current() == channel_thread_);
+void ConnectionMonitor::PollConnectionStats_w() {
+ ASSERT(rtc::Thread::Current() == worker_thread_);
rtc::CritScope cs(&crit_);
// Gather connection infos
- channel_->GetStats(&connection_infos_);
+ stats_getter_->GetConnectionStats(&connection_infos_);
// Signal the monitoring thread, start another poll timer
monitoring_thread_->Post(this, MSG_MONITOR_SIGNAL);
- if (poll)
- channel_thread_->PostDelayed(rate_, this, MSG_MONITOR_POLL);
+ worker_thread_->PostDelayed(rate_, this, MSG_MONITOR_POLL);
}
} // namespace cricket
diff --git a/webrtc/p2p/client/socketmonitor.h b/webrtc/p2p/client/socketmonitor.h
index 5c10a4e..e0dd81e 100644
--- a/webrtc/p2p/client/socketmonitor.h
+++ b/webrtc/p2p/client/socketmonitor.h
@@ -13,36 +13,44 @@
#include <vector>
-#include "webrtc/p2p/base/transportchannel.h"
#include "webrtc/base/criticalsection.h"
#include "webrtc/base/sigslot.h"
#include "webrtc/base/thread.h"
+#include "webrtc/p2p/base/transport.h" // for ConnectionInfos
+
+// TODO(pthatcher): Move these to connectionmonitor.h and
+// connectionmonitor.cc, or just move them into channel.cc
namespace cricket {
-class SocketMonitor : public rtc::MessageHandler,
- public sigslot::has_slots<> {
+class ConnectionStatsGetter {
public:
- SocketMonitor(TransportChannel* channel,
- rtc::Thread* worker_thread,
- rtc::Thread* monitor_thread);
- ~SocketMonitor();
+ virtual ~ConnectionStatsGetter() {}
+ virtual bool GetConnectionStats(ConnectionInfos* infos) = 0;
+};
+
+class ConnectionMonitor : public rtc::MessageHandler,
+ public sigslot::has_slots<> {
+public:
+ ConnectionMonitor(ConnectionStatsGetter* stats_getter,
+ rtc::Thread* worker_thread,
+ rtc::Thread* monitoring_thread);
+ ~ConnectionMonitor();
void Start(int cms);
void Stop();
- rtc::Thread* monitor_thread() { return monitoring_thread_; }
-
- sigslot::signal2<SocketMonitor*,
+ sigslot::signal2<ConnectionMonitor*,
const std::vector<ConnectionInfo>&> SignalUpdate;
protected:
void OnMessage(rtc::Message* message);
- void PollSocket(bool poll);
+ private:
+ void PollConnectionStats_w();
std::vector<ConnectionInfo> connection_infos_;
- TransportChannel* channel_;
- rtc::Thread* channel_thread_;
+ ConnectionStatsGetter* stats_getter_;
+ rtc::Thread* worker_thread_;
rtc::Thread* monitoring_thread_;
rtc::CriticalSection crit_;
uint32 rate_;