• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 {
PriorityMapPointerPriorityMapPointer27     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 
server_think_time_in_s()76   static double server_think_time_in_s() { return server_think_time_in_s_; }
set_server_think_time_in_s(double value)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