blob: 44edbb46c0d697f4545ecdb467992f94abd2b1d1 [file] [log] [blame]
// Copyright (c) 2014 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef NET_BASE_NETWORK_ACTIVITY_MONITOR_H_
#define NET_BASE_NETWORK_ACTIVITY_MONITOR_H_
#include "base/lazy_instance.h"
#include "base/macros.h"
#include "base/synchronization/lock.h"
#include "base/time/time.h"
#include "net/base/net_export.h"
#include "starboard/types.h"
namespace net {
namespace test {
class NetworkActivityMonitorPeer;
} // namespace test
// NetworkActivityMonitor tracks network activity across all sockets and
// provides cumulative statistics about bytes sent to and received from
// the network. It uses a lock to ensure thread-safety.
//
// There are a few caveats:
// * Bytes "sent" includes all send attempts and may include
// some bytes which were actually never sent over the network.
// * Bytes received includes only bytes actually received from the network,
// and does not include any bytes read from the the cache.
// * Network activity not initiated directly using chromium sockets won't
// be reflected here (for instance DNS queries issued by getaddrinfo()).
class NET_EXPORT_PRIVATE NetworkActivityMonitor {
public:
// Returns the singleton instance of the monitor.
static NetworkActivityMonitor* GetInstance();
void IncrementBytesReceived(uint64_t bytes_received);
void IncrementBytesSent(uint64_t bytes_sent);
uint64_t GetBytesReceived() const;
uint64_t GetBytesSent() const;
base::TimeDelta GetTimeSinceLastReceived() const;
base::TimeDelta GetTimeSinceLastSent() const;
private:
friend class test::NetworkActivityMonitorPeer;
NetworkActivityMonitor();
~NetworkActivityMonitor();
friend struct base::LazyInstanceTraitsBase<NetworkActivityMonitor>;
// Protects all the following members.
mutable base::Lock lock_;
uint64_t bytes_received_;
uint64_t bytes_sent_;
base::TimeTicks last_received_ticks_;
base::TimeTicks last_sent_ticks_;
DISALLOW_COPY_AND_ASSIGN(NetworkActivityMonitor);
};
} // namespace net
#endif // NET_BASE_NETWORK_ACTIVITY_MONITOR_H_