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 server_think_time_in_s()78 static double server_think_time_in_s() { return server_think_time_in_s_; } set_server_think_time_in_s(double value)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