// // 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 #include #include #include #include // 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 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 events_; Time* time_; DISALLOW_COPY_AND_ASSIGN(EventHistory); }; } // namespace shill #endif // SHILL_NET_EVENT_HISTORY_H_