1 // Copyright (c) 2012 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.
5 #ifndef CHROME_COMMON_WORKER_THREAD_TICKER_H_
6 #define CHROME_COMMON_WORKER_THREAD_TICKER_H_
10 #include "base/synchronization/lock.h"
11 #include "base/threading/thread.h"
13 // This class provides the following functionality:
14 // It invokes a set of registered handlers at periodic intervals in
15 // the context of an arbitrary worker thread.
16 // 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.
19 class WorkerThreadTicker
{
21 // This callback interface to be implemented by clients of this
25 // Gets invoked when the timer period is up
26 virtual void OnTick() = 0;
29 virtual ~Callback() {}
32 // tick_interval is the periodic interval in which to invoke the
33 // registered handlers (in milliseconds)
34 explicit WorkerThreadTicker(int tick_interval
);
36 ~WorkerThreadTicker();
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
);
43 // Unregisters a callback handler interface
44 // tick_handler is the handler interface to unregister
45 bool UnregisterTickHandler(Callback
*tick_handler
);
47 // Starts the ticker. Returns false if the ticker is already running
48 // or if the Start fails.
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
55 bool IsRunning() const {
59 void set_tick_interval(int tick_interval
) {
60 tick_interval_
= base::TimeDelta::FromMilliseconds(tick_interval
);
63 int tick_interval() const {
64 return tick_interval_
.InMilliseconds();
68 void ScheduleTimerTask();
72 // A list type that holds all registered callback interfaces
73 typedef std::vector
<Callback
*> TickHandlerListType
;
75 // Lock to protect is_running_ and tick_handler_list_
78 base::Thread timer_thread_
;
81 // The interval at which the callbacks are to be invoked
82 base::TimeDelta tick_interval_
;
84 // A list that holds all registered callback interfaces
85 TickHandlerListType tick_handler_list_
;
87 DISALLOW_COPY_AND_ASSIGN(WorkerThreadTicker
);
90 #endif // CHROME_COMMON_WORKER_THREAD_TICKER_H_