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