C++程序  |  101行  |  3.53 KB

//
// 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_