BUG=3379 R=niklas.enbom@webrtc.org Review URL: https://webrtc-codereview.appspot.com/27709005 git-svn-id: http://webrtc.googlecode.com/svn/trunk@7459 4adac7df-926f-26a2-2b94-8c16560cd09d
98 lines
2.5 KiB
C++
98 lines
2.5 KiB
C++
/*
|
|
* Copyright 2004 The WebRTC Project Authors. All rights reserved.
|
|
*
|
|
* Use of this source code is governed by a BSD-style license
|
|
* that can be found in the LICENSE file in the root of the source
|
|
* tree. An additional intellectual property rights grant can be found
|
|
* in the file PATENTS. All contributing project authors may
|
|
* be found in the AUTHORS file in the root of the source tree.
|
|
*/
|
|
|
|
#include "webrtc/p2p/client/socketmonitor.h"
|
|
|
|
#include "webrtc/base/common.h"
|
|
|
|
namespace cricket {
|
|
|
|
enum {
|
|
MSG_MONITOR_POLL,
|
|
MSG_MONITOR_START,
|
|
MSG_MONITOR_STOP,
|
|
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;
|
|
monitoring_ = false;
|
|
}
|
|
|
|
SocketMonitor::~SocketMonitor() {
|
|
channel_thread_->Clear(this);
|
|
monitoring_thread_->Clear(this);
|
|
}
|
|
|
|
void SocketMonitor::Start(int milliseconds) {
|
|
rate_ = milliseconds;
|
|
if (rate_ < 250)
|
|
rate_ = 250;
|
|
channel_thread_->Post(this, MSG_MONITOR_START);
|
|
}
|
|
|
|
void SocketMonitor::Stop() {
|
|
channel_thread_->Post(this, MSG_MONITOR_STOP);
|
|
}
|
|
|
|
void SocketMonitor::OnMessage(rtc::Message *message) {
|
|
rtc::CritScope cs(&crit_);
|
|
switch (message->message_id) {
|
|
case MSG_MONITOR_START:
|
|
ASSERT(rtc::Thread::Current() == channel_thread_);
|
|
if (!monitoring_) {
|
|
monitoring_ = true;
|
|
PollSocket(true);
|
|
}
|
|
break;
|
|
|
|
case MSG_MONITOR_STOP:
|
|
ASSERT(rtc::Thread::Current() == channel_thread_);
|
|
if (monitoring_) {
|
|
monitoring_ = false;
|
|
channel_thread_->Clear(this);
|
|
}
|
|
break;
|
|
|
|
case MSG_MONITOR_POLL:
|
|
ASSERT(rtc::Thread::Current() == channel_thread_);
|
|
PollSocket(true);
|
|
break;
|
|
|
|
case MSG_MONITOR_SIGNAL: {
|
|
ASSERT(rtc::Thread::Current() == monitoring_thread_);
|
|
std::vector<ConnectionInfo> infos = connection_infos_;
|
|
crit_.Leave();
|
|
SignalUpdate(this, infos);
|
|
crit_.Enter();
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
void SocketMonitor::PollSocket(bool poll) {
|
|
ASSERT(rtc::Thread::Current() == channel_thread_);
|
|
rtc::CritScope cs(&crit_);
|
|
|
|
// Gather connection infos
|
|
channel_->GetStats(&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);
|
|
}
|
|
|
|
} // namespace cricket
|