1 // Copyright 2014 The Chromium Authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style license that can be 3 // found in the LICENSE file. 4 5 #include "chrome/browser/safe_browsing/incident_reporting/delayed_callback_runner.h" 6 7 #include "base/location.h" 8 9 namespace safe_browsing { 10 DelayedCallbackRunner(base::TimeDelta delay,const scoped_refptr<base::TaskRunner> & task_runner)11DelayedCallbackRunner::DelayedCallbackRunner( 12 base::TimeDelta delay, 13 const scoped_refptr<base::TaskRunner>& task_runner) 14 : task_runner_(task_runner), 15 next_callback_(callbacks_.end()), 16 timer_(FROM_HERE, delay, this, &DelayedCallbackRunner::OnTimer) { 17 } 18 ~DelayedCallbackRunner()19DelayedCallbackRunner::~DelayedCallbackRunner() { 20 } 21 RegisterCallback(const base::Closure & callback)22void DelayedCallbackRunner::RegisterCallback(const base::Closure& callback) { 23 DCHECK(thread_checker_.CalledOnValidThread()); 24 callbacks_.push_back(callback); 25 } 26 Start()27void DelayedCallbackRunner::Start() { 28 DCHECK(thread_checker_.CalledOnValidThread()); 29 30 // Nothing to do if the runner is already running or nothing has been added. 31 if (next_callback_ != callbacks_.end() || callbacks_.empty()) 32 return; 33 34 // Prime the system with the first callback. 35 next_callback_ = callbacks_.begin(); 36 37 // Point the starter pistol in the air and pull the trigger. 38 timer_.Reset(); 39 } 40 OnTimer()41void DelayedCallbackRunner::OnTimer() { 42 // Run the next callback on the task runner. 43 task_runner_->PostTask(FROM_HERE, *next_callback_); 44 45 // Remove this callback and get ready for the next if there is one. 46 next_callback_ = callbacks_.erase(next_callback_); 47 if (next_callback_ != callbacks_.end()) 48 timer_.Reset(); 49 } 50 51 } // namespace safe_browsing 52