1 // Copyright 2018 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 SERVICES_NETWORK_NETWORK_USAGE_ACCUMULATOR_H_
6 #define SERVICES_NETWORK_NETWORK_USAGE_ACCUMULATOR_H_
7 
8 #include <map>
9 
10 #include "base/component_export.h"
11 #include "base/containers/flat_map.h"
12 #include "base/containers/small_map.h"
13 #include "base/memory/weak_ptr.h"
14 #include "services/network/public/mojom/network_service.mojom.h"
15 
16 namespace network {
17 
18 // NetworkUsageAccumulator keeps track of total network usage for active
19 // consumers.
COMPONENT_EXPORT(NETWORK_SERVICE)20 class COMPONENT_EXPORT(NETWORK_SERVICE) NetworkUsageAccumulator
21     : public base::SupportsWeakPtr<NetworkUsageAccumulator> {
22  public:
23   NetworkUsageAccumulator();
24   ~NetworkUsageAccumulator();
25 
26   // Reports raw network usage to this accumulator.
27   void OnBytesTransferred(uint32_t process_id,
28                           uint32_t routing_id,
29                           int64_t bytes_received,
30                           int64_t bytes_sent);
31 
32   // Marks a process as inactive and remove the entry.
33   void ClearBytesTransferredForProcess(uint32_t process_id);
34 
35   // Returns the accumulated network usage for active consumers.
36   std::vector<mojom::NetworkUsagePtr> GetTotalNetworkUsages() const;
37 
38  private:
39   struct NetworkUsageParam;
40 
41   // Number of active processes is usually small, but could go as high as
42   // |PhysicalMemoryMB / 80|.
43   // See |RenderProcessHost::GetMaxRendererProcessCount()|.
44   base::small_map<
45       std::map<uint32_t /* process_id */,
46                base::flat_map<uint32_t /* routing_id */, NetworkUsageParam>>>
47       total_network_usages_;
48 
49   DISALLOW_COPY_AND_ASSIGN(NetworkUsageAccumulator);
50 };
51 
52 }  // namespace network
53 
54 #endif  // SERVICES_NETWORK_NETWORK_USAGE_ACCUMULATOR_H_
55