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.
5 #ifndef NET_TOOLS_FLIP_SERVER_OUTPUT_ORDERING_H_
6 #define NET_TOOLS_FLIP_SERVER_OUTPUT_ORDERING_H_
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"
20 class SMConnectionInterface
;
22 class OutputOrdering
{
24 typedef std::list
<MemCacheIter
> PriorityRing
;
25 typedef std::map
<uint32
, PriorityRing
> PriorityMap
;
27 struct PriorityMapPointer
{
29 ~PriorityMapPointer();
31 PriorityRing::iterator it
;
33 EpollServer::AlarmRegToken alarm_token
;
36 typedef std::map
<uint32
, PriorityMapPointer
> StreamIdToPriorityMap
;
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_
;
46 explicit OutputOrdering(SMConnectionInterface
* connection
);
49 bool ExistsInPriorityMaps(uint32 stream_id
) const;
51 struct BeginOutputtingAlarm
: public EpollAlarmCallbackInterface
{
53 BeginOutputtingAlarm(OutputOrdering
* oo
,
54 OutputOrdering::PriorityMapPointer
* pmp
,
55 const MemCacheIter
& mci
);
56 ~BeginOutputtingAlarm() override
;
58 // EpollAlarmCallbackInterface:
59 int64
OnAlarm() override
;
60 void OnRegistration(const EpollServer::AlarmRegToken
& tok
,
61 EpollServer
* eps
) override
;
62 void OnUnregistration() override
;
63 void OnShutdown(EpollServer
* eps
) override
;
66 OutputOrdering
* output_ordering_
;
67 OutputOrdering::PriorityMapPointer
* pmp_
;
69 EpollServer
* epoll_server_
;
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
);
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
;
84 static double server_think_time_in_s_
;
89 #endif // NET_TOOLS_FLIP_SERVER_OUTPUT_ORDERING_H_