Home | History | Annotate | Download | only in flip_server
      1 // Copyright (c) 2011 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 #ifndef NET_TOOLS_FLIP_SERVER_OUTPUT_ORDERING_H_
      6 #define NET_TOOLS_FLIP_SERVER_OUTPUT_ORDERING_H_
      7 
      8 #include <list>
      9 #include <map>
     10 #include <string>
     11 
     12 #include "base/basictypes.h"
     13 #include "base/compiler_specific.h"
     14 #include "net/tools/epoll_server/epoll_server.h"
     15 #include "net/tools/flip_server/constants.h"
     16 #include "net/tools/flip_server/mem_cache.h"
     17 
     18 namespace net {
     19 
     20 class SMConnectionInterface;
     21 
     22 class OutputOrdering {
     23  public:
     24   typedef std::list<MemCacheIter> PriorityRing;
     25   typedef std::map<uint32, PriorityRing> PriorityMap;
     26 
     27   struct PriorityMapPointer {
     28     PriorityMapPointer();
     29     ~PriorityMapPointer();
     30     PriorityRing* ring;
     31     PriorityRing::iterator it;
     32     bool alarm_enabled;
     33     EpollServer::AlarmRegToken alarm_token;
     34   };
     35 
     36   typedef std::map<uint32, PriorityMapPointer> StreamIdToPriorityMap;
     37 
     38   StreamIdToPriorityMap stream_ids_;
     39   PriorityMap priority_map_;
     40   PriorityRing first_data_senders_;
     41   uint32 first_data_senders_threshold_;  // when you've passed this, you're no
     42                                          // longer a first_data_sender...
     43   SMConnectionInterface* connection_;
     44   EpollServer* epoll_server_;
     45 
     46   explicit OutputOrdering(SMConnectionInterface* connection);
     47   ~OutputOrdering();
     48   void Reset();
     49   bool ExistsInPriorityMaps(uint32 stream_id) const;
     50 
     51   struct BeginOutputtingAlarm : public EpollAlarmCallbackInterface {
     52    public:
     53     BeginOutputtingAlarm(OutputOrdering* oo,
     54                          OutputOrdering::PriorityMapPointer* pmp,
     55                          const MemCacheIter& mci);
     56     virtual ~BeginOutputtingAlarm();
     57 
     58     // EpollAlarmCallbackInterface:
     59     virtual int64 OnAlarm() OVERRIDE;
     60     virtual void OnRegistration(const EpollServer::AlarmRegToken& tok,
     61                                 EpollServer* eps) OVERRIDE;
     62     virtual void OnUnregistration() OVERRIDE;
     63     virtual void OnShutdown(EpollServer* eps) OVERRIDE;
     64 
     65    private:
     66     OutputOrdering* output_ordering_;
     67     OutputOrdering::PriorityMapPointer* pmp_;
     68     MemCacheIter mci_;
     69     EpollServer* epoll_server_;
     70   };
     71 
     72   void MoveToActive(PriorityMapPointer* pmp, MemCacheIter mci);
     73   void AddToOutputOrder(const MemCacheIter& mci);
     74   void SpliceToPriorityRing(PriorityRing::iterator pri);
     75   MemCacheIter* GetIter();
     76   void RemoveStreamId(uint32 stream_id);
     77 
     78   static double server_think_time_in_s() { return server_think_time_in_s_; }
     79   static void set_server_think_time_in_s(double value) {
     80     server_think_time_in_s_ = value;
     81   }
     82 
     83  private:
     84   static double server_think_time_in_s_;
     85 };
     86 
     87 }  // namespace net
     88 
     89 #endif  // NET_TOOLS_FLIP_SERVER_OUTPUT_ORDERING_H_
     90