1cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)// Copyright 2014 The Chromium Authors. All rights reserved.
2cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
3cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)// found in the LICENSE file.
4cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
5cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "chrome/browser/sync_file_system/task_logger.h"
6cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
7f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#include "base/lazy_instance.h"
8cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "base/stl_util.h"
9f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#include "base/synchronization/lock.h"
10cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
11cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)namespace sync_file_system {
12cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
13cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)namespace {
14f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
15cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)const size_t kMaxLogSize = 500;
16f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
17f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)int g_next_log_id = 1;
18f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)base::LazyInstance<base::Lock>::Leaky g_log_id_lock = LAZY_INSTANCE_INITIALIZER;
19f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
20f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)int GenerateLogID() {
21f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  base::AutoLock lock(g_log_id_lock.Get());
22f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  return g_next_log_id++;
23f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)}
24f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
25cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}  // namespace
26cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
27cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)typedef TaskLogger::TaskLog TaskLog;
28cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
29f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)TaskLogger::TaskLog::TaskLog() : log_id(GenerateLogID()) {}
30cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)TaskLogger::TaskLog::~TaskLog() {}
31cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
32cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)TaskLogger::TaskLogger() {}
33cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
34cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)TaskLogger::~TaskLogger() {
35cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  ClearLog();
36cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}
37cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
38cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)void TaskLogger::RecordLog(scoped_ptr<TaskLog> log) {
3946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  if (!log)
4046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    return;
4146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
42cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  if (log_history_.size() >= kMaxLogSize) {
43cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    delete log_history_.front();
44cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    log_history_.pop_front();
45cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  }
46cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
47cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  log_history_.push_back(log.release());
48cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
49cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  FOR_EACH_OBSERVER(Observer, observers_,
50cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                    OnLogRecorded(*log_history_.back()));
51cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}
52cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
53cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)void TaskLogger::ClearLog() {
54cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  STLDeleteContainerPointers(log_history_.begin(), log_history_.end());
55cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  log_history_.clear();
56cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}
57cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
58cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)void TaskLogger::AddObserver(Observer* observer) {
59cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  observers_.AddObserver(observer);
60cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}
61cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
62cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)void TaskLogger::RemoveObserver(Observer* observer) {
63cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  observers_.RemoveObserver(observer);
64cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}
65cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
66cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)const TaskLogger::LogList& TaskLogger::GetLog() const {
67cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  return log_history_;
68cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}
69cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
70cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}  // namespace sync_file_system
71