blob: 0443015683b0232e2ec6e7f6fc6e9b9c077296c5 [file] [log] [blame]
[email protected]02798a982012-01-27 00:45:331// Copyright (c) 2012 The Chromium Authors. All rights reserved.
license.botbf09a502008-08-24 00:55:552// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
initial.commit09911bf2008-07-26 23:55:294
[email protected]20cb5f482009-12-16 01:01:255#ifndef CHROME_COMMON_WORKER_THREAD_TICKER_H_
6#define CHROME_COMMON_WORKER_THREAD_TICKER_H_
initial.commit09911bf2008-07-26 23:55:297
initial.commit09911bf2008-07-26 23:55:298#include <vector>
9
[email protected]20305ec2011-01-21 04:55:5210#include "base/synchronization/lock.h"
[email protected]34b99632011-01-01 01:01:0611#include "base/threading/thread.h"
initial.commit09911bf2008-07-26 23:55:2912
[email protected]d195f602009-01-14 17:23:1913// This class provides the following functionality:
initial.commit09911bf2008-07-26 23:55:2914// It invokes a set of registered handlers at periodic intervals in
15// the context of an arbitrary worker thread.
[email protected]d195f602009-01-14 17:23:1916// The timer runs on a separate thread, so it will run even if the current
17// thread is hung. Similarly, the callbacks will be called on a separate
18// thread so they won't block the main thread.
initial.commit09911bf2008-07-26 23:55:2919class WorkerThreadTicker {
20 public:
21 // This callback interface to be implemented by clients of this
22 // class
23 class Callback {
24 public:
25 // Gets invoked when the timer period is up
26 virtual void OnTick() = 0;
[email protected]20cb5f482009-12-16 01:01:2527
28 protected:
29 virtual ~Callback() {}
initial.commit09911bf2008-07-26 23:55:2930 };
31
32 // tick_interval is the periodic interval in which to invoke the
[email protected]d195f602009-01-14 17:23:1933 // registered handlers (in milliseconds)
initial.commit09911bf2008-07-26 23:55:2934 explicit WorkerThreadTicker(int tick_interval);
35
36 ~WorkerThreadTicker();
37
38 // Registers a callback handler interface
39 // tick_handler is the handler interface to register. The ownership of this
40 // object is not transferred to this class.
41 bool RegisterTickHandler(Callback *tick_handler);
42
43 // Unregisters a callback handler interface
44 // tick_handler is the handler interface to unregister
45 bool UnregisterTickHandler(Callback *tick_handler);
46
47 // Starts the ticker. Returns false if the ticker is already running
48 // or if the Start fails.
49 bool Start();
50 // Stops the ticker and waits for all callbacks. to be done. This method
51 // does not provide a way to stop without waiting for the callbacks to be
52 // done because this is inherently risky.
53 // Returns false is the ticker is not running
54 bool Stop();
[email protected]d195f602009-01-14 17:23:1955 bool IsRunning() const {
56 return is_running_;
57 }
initial.commit09911bf2008-07-26 23:55:2958
59 void set_tick_interval(int tick_interval) {
[email protected]02798a982012-01-27 00:45:3360 tick_interval_ = base::TimeDelta::FromMilliseconds(tick_interval);
initial.commit09911bf2008-07-26 23:55:2961 }
62
initial.commit09911bf2008-07-26 23:55:2963 private:
[email protected]d195f602009-01-14 17:23:1964 void ScheduleTimerTask();
65
[email protected]689949452011-12-08 02:36:3966 void TimerTask();
67
initial.commit09911bf2008-07-26 23:55:2968 // A list type that holds all registered callback interfaces
69 typedef std::vector<Callback*> TickHandlerListType;
70
[email protected]d195f602009-01-14 17:23:1971 // Lock to protect is_running_ and tick_handler_list_
[email protected]20305ec2011-01-21 04:55:5272 base::Lock lock_;
initial.commit09911bf2008-07-26 23:55:2973
[email protected]d195f602009-01-14 17:23:1974 base::Thread timer_thread_;
75 bool is_running_;
initial.commit09911bf2008-07-26 23:55:2976
initial.commit09911bf2008-07-26 23:55:2977 // The interval at which the callbacks are to be invoked
[email protected]02798a982012-01-27 00:45:3378 base::TimeDelta tick_interval_;
[email protected]d195f602009-01-14 17:23:1979
initial.commit09911bf2008-07-26 23:55:2980 // A list that holds all registered callback interfaces
81 TickHandlerListType tick_handler_list_;
82
[email protected]d195f602009-01-14 17:23:1983 DISALLOW_COPY_AND_ASSIGN(WorkerThreadTicker);
initial.commit09911bf2008-07-26 23:55:2984};
85
[email protected]20cb5f482009-12-16 01:01:2586#endif // CHROME_COMMON_WORKER_THREAD_TICKER_H_