• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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.
4 
5 #ifndef CHROME_COMMON_WORKER_THREAD_TICKER_H_
6 #define CHROME_COMMON_WORKER_THREAD_TICKER_H_
7 
8 #include <vector>
9 
10 #include "base/synchronization/lock.h"
11 #include "base/threading/thread.h"
12 
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 {
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;
27 
28    protected:
~Callback()29     virtual ~Callback() {}
30   };
31 
32   // tick_interval is the periodic interval in which to invoke the
33   // registered handlers (in milliseconds)
34   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();
IsRunning()55   bool IsRunning() const {
56     return is_running_;
57   }
58 
set_tick_interval(int tick_interval)59   void set_tick_interval(int tick_interval) {
60     tick_interval_ = base::TimeDelta::FromMilliseconds(tick_interval);
61   }
62 
tick_interval()63   int tick_interval() const {
64     return tick_interval_.InMilliseconds();
65   }
66 
67  private:
68   void ScheduleTimerTask();
69 
70   void TimerTask();
71 
72   // A list type that holds all registered callback interfaces
73   typedef std::vector<Callback*> TickHandlerListType;
74 
75   // Lock to protect is_running_ and tick_handler_list_
76   base::Lock lock_;
77 
78   base::Thread timer_thread_;
79   bool is_running_;
80 
81   // The interval at which the callbacks are to be invoked
82   base::TimeDelta tick_interval_;
83 
84   // A list that holds all registered callback interfaces
85   TickHandlerListType tick_handler_list_;
86 
87   DISALLOW_COPY_AND_ASSIGN(WorkerThreadTicker);
88 };
89 
90 #endif  // CHROME_COMMON_WORKER_THREAD_TICKER_H_
91