Home | History | Annotate | Download | only in quic
      1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
      2 // Use of this source code is governed by a BSD-style license that can be
      3 // found in the LICENSE file.
      4 
      5 #include "net/tools/quic/quic_epoll_connection_helper.h"
      6 
      7 #include <errno.h>
      8 #include <sys/socket.h>
      9 
     10 #include "base/logging.h"
     11 #include "base/stl_util.h"
     12 #include "net/base/ip_endpoint.h"
     13 #include "net/quic/crypto/quic_random.h"
     14 #include "net/tools/epoll_server/epoll_server.h"
     15 #include "net/tools/quic/quic_socket_utils.h"
     16 
     17 namespace net {
     18 namespace tools {
     19 
     20 namespace {
     21 
     22 class QuicEpollAlarm : public QuicAlarm {
     23  public:
     24   QuicEpollAlarm(EpollServer* epoll_server,
     25                  QuicAlarm::Delegate* delegate)
     26       : QuicAlarm(delegate),
     27         epoll_server_(epoll_server),
     28         epoll_alarm_impl_(this) {}
     29 
     30  protected:
     31   virtual void SetImpl() OVERRIDE {
     32     DCHECK(deadline().IsInitialized());
     33     epoll_server_->RegisterAlarm(
     34         deadline().Subtract(QuicTime::Zero()).ToMicroseconds(),
     35         &epoll_alarm_impl_);
     36   }
     37 
     38   virtual void CancelImpl() OVERRIDE {
     39     DCHECK(!deadline().IsInitialized());
     40     epoll_alarm_impl_.UnregisterIfRegistered();
     41   }
     42 
     43  private:
     44   class EpollAlarmImpl : public EpollAlarm {
     45    public:
     46     explicit EpollAlarmImpl(QuicEpollAlarm* alarm) : alarm_(alarm) {}
     47 
     48     virtual int64 OnAlarm() OVERRIDE {
     49       EpollAlarm::OnAlarm();
     50       alarm_->Fire();
     51       // Fire will take care of registering the alarm, if needed.
     52       return 0;
     53     }
     54 
     55    private:
     56     QuicEpollAlarm* alarm_;
     57   };
     58 
     59   EpollServer* epoll_server_;
     60   EpollAlarmImpl epoll_alarm_impl_;
     61 };
     62 
     63 }  // namespace
     64 
     65 QuicEpollConnectionHelper::QuicEpollConnectionHelper(EpollServer* epoll_server)
     66     : epoll_server_(epoll_server),
     67       clock_(epoll_server),
     68       random_generator_(QuicRandom::GetInstance()) {
     69 }
     70 
     71 QuicEpollConnectionHelper::~QuicEpollConnectionHelper() {
     72 }
     73 
     74 const QuicClock* QuicEpollConnectionHelper::GetClock() const {
     75   return &clock_;
     76 }
     77 
     78 QuicRandom* QuicEpollConnectionHelper::GetRandomGenerator() {
     79   return random_generator_;
     80 }
     81 
     82 QuicAlarm* QuicEpollConnectionHelper::CreateAlarm(
     83     QuicAlarm::Delegate* delegate) {
     84   return new QuicEpollAlarm(epoll_server_, delegate);
     85 }
     86 
     87 }  // namespace tools
     88 }  // namespace net
     89