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