100 lines
3.5 KiB
C++
100 lines
3.5 KiB
C++
//
|
|
// Copyright (C) 2015 The Android Open Source Project
|
|
//
|
|
// Licensed under the Apache License, Version 2.0 (the "License");
|
|
// you may not use this file except in compliance with the License.
|
|
// You may obtain a copy of the License at
|
|
//
|
|
// http://www.apache.org/licenses/LICENSE-2.0
|
|
//
|
|
// Unless required by applicable law or agreed to in writing, software
|
|
// distributed under the License is distributed on an "AS IS" BASIS,
|
|
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
// See the License for the specific language governing permissions and
|
|
// limitations under the License.
|
|
//
|
|
|
|
#ifndef SHILL_NET_EVENT_HISTORY_H_
|
|
#define SHILL_NET_EVENT_HISTORY_H_
|
|
|
|
#include <deque>
|
|
#include <string>
|
|
#include <vector>
|
|
|
|
#include <base/macros.h>
|
|
#include <gtest/gtest_prod.h> // for FRIEND_TEST
|
|
|
|
#include "shill/net/shill_export.h"
|
|
#include "shill/net/shill_time.h"
|
|
|
|
namespace shill {
|
|
|
|
// EventHistory is a list of timestamps tracking the occurrence of one or more
|
|
// events. Events are ordered from earliest to latest. |max_events_saved|
|
|
// can optionally be provided to limit the number of event timestamps saved
|
|
// at any one time.
|
|
class SHILL_EXPORT EventHistory {
|
|
public:
|
|
enum ClockType {
|
|
kClockTypeBoottime = 0,
|
|
kClockTypeMonotonic = 1,
|
|
};
|
|
|
|
EventHistory() : max_events_specified_(false), time_(Time::GetInstance()) {}
|
|
explicit EventHistory(int max_events_saved)
|
|
: max_events_specified_(true),
|
|
max_events_saved_(max_events_saved),
|
|
time_(Time::GetInstance()) {}
|
|
|
|
// Records the current event by adding the current time to the list.
|
|
// If |event_limit_specificed_| and the size of |events_| is larger than
|
|
// |max_events_saved_|, event timestamps are removed in FIFO order until the
|
|
// size of |events_| is equal to |max_events_saved_|.
|
|
void RecordEvent();
|
|
|
|
// Start at the head of |events_| and remove all entries that occurred
|
|
// more than |seconds_ago| prior to the current time. |clock_type| determines
|
|
// what time of clock we use for time-related calculations.
|
|
void ExpireEventsBefore(int seconds_ago, ClockType clock_type);
|
|
|
|
// Records the current event by adding the current time to the list, and uses
|
|
// this same timestamp to remove all entries that occurred more than
|
|
// |seconds_ago|. |clock_type| determines what time of clock we use for time-
|
|
// related calculations.
|
|
void RecordEventAndExpireEventsBefore(int seconds_ago, ClockType clock_type);
|
|
|
|
// Returns a vector of human-readable strings representing each timestamp in
|
|
// |events_|.
|
|
std::vector<std::string> ExtractWallClockToStrings() const;
|
|
|
|
// Returns the number of timestamps in |events_| within the interval spanning
|
|
// now and the time |seconds_ago| before now (inclusive). |clock_type|
|
|
// determines what time of clock we use for time-related calculations.
|
|
int CountEventsWithinInterval(int seconds_ago, ClockType clock_type);
|
|
|
|
size_t Size() const { return events_.size(); }
|
|
bool Empty() { return events_.empty(); }
|
|
Timestamp Front() { return events_.front(); }
|
|
void Clear() { events_.clear(); }
|
|
|
|
private:
|
|
friend class EventHistoryTest;
|
|
friend class ServiceTest; // RecordEventInternal, time_
|
|
friend class WakeOnWiFiTest; // time_
|
|
|
|
void RecordEventInternal(Timestamp now);
|
|
|
|
void ExpireEventsBeforeInternal(int seconds_ago, Timestamp now,
|
|
ClockType clock_type);
|
|
|
|
bool max_events_specified_;
|
|
int max_events_saved_;
|
|
std::deque<Timestamp> events_;
|
|
Time* time_;
|
|
|
|
DISALLOW_COPY_AND_ASSIGN(EventHistory);
|
|
};
|
|
|
|
} // namespace shill
|
|
|
|
#endif // SHILL_NET_EVENT_HISTORY_H_
|