Home | History | Annotate | Download | only in client
      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 
     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 
     33 ConnectionMonitor::~ConnectionMonitor() {
     34   worker_thread_->Clear(this);
     35   monitoring_thread_->Clear(this);
     36 }
     37 
     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 
     45 void ConnectionMonitor::Stop() {
     46   worker_thread_->Post(this, MSG_MONITOR_STOP);
     47 }
     48 
     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 
     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