15f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)// Copyright 2014 The Chromium Authors. All rights reserved. 25f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 35f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)// found in the LICENSE file. 45f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 56e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)#include "chrome/browser/safe_browsing/incident_reporting/delayed_callback_runner.h" 65f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 75f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "base/location.h" 85f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 95f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)namespace safe_browsing { 105f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 115f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)DelayedCallbackRunner::DelayedCallbackRunner( 125f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) base::TimeDelta delay, 135f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) const scoped_refptr<base::TaskRunner>& task_runner) 145f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) : task_runner_(task_runner), 155f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) next_callback_(callbacks_.end()), 165f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) timer_(FROM_HERE, delay, this, &DelayedCallbackRunner::OnTimer) { 175f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)} 185f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 195f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)DelayedCallbackRunner::~DelayedCallbackRunner() { 205f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)} 215f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 225f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)void DelayedCallbackRunner::RegisterCallback(const base::Closure& callback) { 235f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) DCHECK(thread_checker_.CalledOnValidThread()); 245f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) callbacks_.push_back(callback); 255f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)} 265f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 275f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)void DelayedCallbackRunner::Start() { 285f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) DCHECK(thread_checker_.CalledOnValidThread()); 295f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 305f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) // Nothing to do if the runner is already running or nothing has been added. 315f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) if (next_callback_ != callbacks_.end() || callbacks_.empty()) 325f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) return; 335f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 345f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) // Prime the system with the first callback. 355f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) next_callback_ = callbacks_.begin(); 365f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 375f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) // Point the starter pistol in the air and pull the trigger. 385f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) timer_.Reset(); 395f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)} 405f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 415f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)void DelayedCallbackRunner::OnTimer() { 425f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) // Run the next callback on the task runner. 435f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) task_runner_->PostTask(FROM_HERE, *next_callback_); 445f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 455f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) // Remove this callback and get ready for the next if there is one. 465f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) next_callback_ = callbacks_.erase(next_callback_); 475f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) if (next_callback_ != callbacks_.end()) 485f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) timer_.Reset(); 495f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)} 505f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 515f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)} // namespace safe_browsing 52