• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  *  Copyright 2004 The WebRTC Project Authors. All rights reserved.
3  *
4  *  Use of this source code is governed by a BSD-style license
5  *  that can be found in the LICENSE file in the root of the source
6  *  tree. An additional intellectual property rights grant can be found
7  *  in the file PATENTS.  All contributing project authors may
8  *  be found in the AUTHORS file in the root of the source tree.
9  */
10 
11 #include "webrtc/p2p/client/socketmonitor.h"
12 
13 #include "webrtc/base/common.h"
14 
15 namespace cricket {
16 
17 enum {
18   MSG_MONITOR_POLL,
19   MSG_MONITOR_START,
20   MSG_MONITOR_STOP,
21   MSG_MONITOR_SIGNAL
22 };
23 
ConnectionMonitor(ConnectionStatsGetter * stats_getter,rtc::Thread * worker_thread,rtc::Thread * monitoring_thread)24 ConnectionMonitor::ConnectionMonitor(ConnectionStatsGetter* stats_getter,
25                                      rtc::Thread* worker_thread,
26                                      rtc::Thread* monitoring_thread) {
27   stats_getter_ = stats_getter;
28   worker_thread_ = worker_thread;
29   monitoring_thread_ = monitoring_thread;
30   monitoring_ = false;
31 }
32 
~ConnectionMonitor()33 ConnectionMonitor::~ConnectionMonitor() {
34   worker_thread_->Clear(this);
35   monitoring_thread_->Clear(this);
36 }
37 
Start(int milliseconds)38 void ConnectionMonitor::Start(int milliseconds) {
39   rate_ = milliseconds;
40   if (rate_ < 250)
41     rate_ = 250;
42   worker_thread_->Post(this, MSG_MONITOR_START);
43 }
44 
Stop()45 void ConnectionMonitor::Stop() {
46   worker_thread_->Post(this, MSG_MONITOR_STOP);
47 }
48 
OnMessage(rtc::Message * message)49 void ConnectionMonitor::OnMessage(rtc::Message *message) {
50   rtc::CritScope cs(&crit_);
51   switch (message->message_id) {
52     case MSG_MONITOR_START:
53       ASSERT(rtc::Thread::Current() == worker_thread_);
54       if (!monitoring_) {
55         monitoring_ = true;
56         PollConnectionStats_w();
57       }
58       break;
59 
60     case MSG_MONITOR_STOP:
61       ASSERT(rtc::Thread::Current() == worker_thread_);
62       if (monitoring_) {
63         monitoring_ = false;
64         worker_thread_->Clear(this);
65       }
66       break;
67 
68     case MSG_MONITOR_POLL:
69       ASSERT(rtc::Thread::Current() == worker_thread_);
70       PollConnectionStats_w();
71       break;
72 
73     case MSG_MONITOR_SIGNAL: {
74       ASSERT(rtc::Thread::Current() == monitoring_thread_);
75       std::vector<ConnectionInfo> infos = connection_infos_;
76       crit_.Leave();
77       SignalUpdate(this, infos);
78       crit_.Enter();
79       break;
80     }
81   }
82 }
83 
PollConnectionStats_w()84 void ConnectionMonitor::PollConnectionStats_w() {
85   ASSERT(rtc::Thread::Current() == worker_thread_);
86   rtc::CritScope cs(&crit_);
87 
88   // Gather connection infos
89   stats_getter_->GetConnectionStats(&connection_infos_);
90 
91   // Signal the monitoring thread, start another poll timer
92   monitoring_thread_->Post(this, MSG_MONITOR_SIGNAL);
93   worker_thread_->PostDelayed(rate_, this, MSG_MONITOR_POLL);
94 }
95 
96 }  // namespace cricket
97