diff options
Diffstat (limited to 'net/base/load_log.h')
-rw-r--r-- | net/base/load_log.h | 88 |
1 files changed, 84 insertions, 4 deletions
diff --git a/net/base/load_log.h b/net/base/load_log.h index 0efe242..fcb7d6f 100644 --- a/net/base/load_log.h +++ b/net/base/load_log.h @@ -5,7 +5,10 @@ #ifndef NET_BASE_LOAD_LOG_H_ #define NET_BASE_LOAD_LOG_H_ +#include <vector> + #include "base/ref_counted.h" +#include "base/time.h" namespace net { @@ -13,10 +16,87 @@ namespace net { // a request (waiting in queues, resolving hosts, resolving proxy, etc...). class LoadLog : public base::RefCounted<LoadLog> { public: -// TODO(eroman): Add an API similar to: -// void TrackEnterState(LoadState state); -// void TrackLeaveState(LoadState state); -// void Merge(const LoadLog* other); + + enum EventType { +#define EVENT_TYPE(label) TYPE_ ## label, +#include "net/base/load_log_event_type_list.h" +#undef EVENT_TYPE + }; + + // Whether this is the start/end of an event. Or in the case of EventTypes + // that are "instantaneous", kNone. + enum EventPhase { + PHASE_NONE, + PHASE_BEGIN, + PHASE_END, + }; + + // A logged event. Note that "phase" means if this is the start/end of a + // particular event type (in order to record a timestamp for both endpoints). + struct Event { + Event(base::TimeTicks time, + EventType type, + EventPhase phase) + : time(time), type(type), phase(phase) { + } + + base::TimeTicks time; + EventType type; + EventPhase phase; + }; + + // The maximum size of |events_|. + enum { kMaxNumEntries = 25 }; + + // Ordered set of events that were logged. + // TODO(eroman): use a StackVector or array to avoid allocations. + typedef std::vector<Event> EventList; + + // Create a log, which can hold up to |kMaxNumEntries| Events. + // + // If events are dropped because the log has grown too large, the final + // entry will be of type kLogTruncated. + LoadLog(); + + // -------------------------------------------------------------------------- + + // The public interface for adding events to the log are static methods. + // This makes it easier to deal with optionally NULL LoadLog. + + // Adds an instantaneous event to the log. + static void AddEvent(LoadLog* log, EventType event) { + if (log) + log->Add(base::TimeTicks::Now(), event, PHASE_NONE); + } + + // Adds the start of an event to the log. Presumably this event type measures + // a time duration, and will be matched by a call to EndEvent(event). + static void BeginEvent(LoadLog* log, EventType event) { + if (log) + log->Add(base::TimeTicks::Now(), event, PHASE_BEGIN); + } + + // Adds the end of an event to the log. Presumably this event type measures + // a time duration, and we are matching an earlier call to BeginEvent(event). + static void EndEvent(LoadLog* log, EventType event) { + if (log) + log->Add(base::TimeTicks::Now(), event, PHASE_END); + } + + // -------------------------------------------------------------------------- + + // Returns the list of all events in the log. + const EventList& events() const { + return events_; + } + + // Returns a C-String symbolic name for |event|. + static const char* EventTypeToString(EventType event); + + void Add(base::TimeTicks t, EventType event, EventPhase phase); + + private: + EventList events_; }; } // namespace net |