1 // 2 // Copyright (C) 2015 The Android Open Source Project 3 // 4 // Licensed under the Apache License, Version 2.0 (the "License"); 5 // you may not use this file except in compliance with the License. 6 // You may obtain a copy of the License at 7 // 8 // http://www.apache.org/licenses/LICENSE-2.0 9 // 10 // Unless required by applicable law or agreed to in writing, software 11 // distributed under the License is distributed on an "AS IS" BASIS, 12 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 // See the License for the specific language governing permissions and 14 // limitations under the License. 15 // 16 17 #ifndef SHILL_NET_EVENT_HISTORY_H_ 18 #define SHILL_NET_EVENT_HISTORY_H_ 19 20 #include <deque> 21 #include <string> 22 #include <vector> 23 24 #include <base/macros.h> 25 #include <gtest/gtest_prod.h> // for FRIEND_TEST 26 27 #include "shill/net/shill_export.h" 28 #include "shill/net/shill_time.h" 29 30 namespace shill { 31 32 // EventHistory is a list of timestamps tracking the occurrence of one or more 33 // events. Events are ordered from earliest to latest. |max_events_saved| 34 // can optionally be provided to limit the number of event timestamps saved 35 // at any one time. 36 class SHILL_EXPORT EventHistory { 37 public: 38 enum ClockType { 39 kClockTypeBoottime = 0, 40 kClockTypeMonotonic = 1, 41 }; 42 EventHistory()43 EventHistory() : max_events_specified_(false), time_(Time::GetInstance()) {} EventHistory(int max_events_saved)44 explicit EventHistory(int max_events_saved) 45 : max_events_specified_(true), 46 max_events_saved_(max_events_saved), 47 time_(Time::GetInstance()) {} 48 49 // Records the current event by adding the current time to the list. 50 // If |event_limit_specificed_| and the size of |events_| is larger than 51 // |max_events_saved_|, event timestamps are removed in FIFO order until the 52 // size of |events_| is equal to |max_events_saved_|. 53 void RecordEvent(); 54 55 // Start at the head of |events_| and remove all entries that occurred 56 // more than |seconds_ago| prior to the current time. |clock_type| determines 57 // what time of clock we use for time-related calculations. 58 void ExpireEventsBefore(int seconds_ago, ClockType clock_type); 59 60 // Records the current event by adding the current time to the list, and uses 61 // this same timestamp to remove all entries that occurred more than 62 // |seconds_ago|. |clock_type| determines what time of clock we use for time- 63 // related calculations. 64 void RecordEventAndExpireEventsBefore(int seconds_ago, ClockType clock_type); 65 66 // Returns a vector of human-readable strings representing each timestamp in 67 // |events_|. 68 std::vector<std::string> ExtractWallClockToStrings() const; 69 70 // Returns the number of timestamps in |events_| within the interval spanning 71 // now and the time |seconds_ago| before now (inclusive). |clock_type| 72 // determines what time of clock we use for time-related calculations. 73 int CountEventsWithinInterval(int seconds_ago, ClockType clock_type); 74 Size()75 size_t Size() const { return events_.size(); } Empty()76 bool Empty() { return events_.empty(); } Front()77 Timestamp Front() { return events_.front(); } Clear()78 void Clear() { events_.clear(); } 79 80 private: 81 friend class EventHistoryTest; 82 friend class ServiceTest; // RecordEventInternal, time_ 83 friend class WakeOnWiFiTest; // time_ 84 85 void RecordEventInternal(Timestamp now); 86 87 void ExpireEventsBeforeInternal(int seconds_ago, Timestamp now, 88 ClockType clock_type); 89 90 bool max_events_specified_; 91 int max_events_saved_; 92 std::deque<Timestamp> events_; 93 Time* time_; 94 95 DISALLOW_COPY_AND_ASSIGN(EventHistory); 96 }; 97 98 } // namespace shill 99 100 #endif // SHILL_NET_EVENT_HISTORY_H_ 101