worker_thread_ticker.h revision 3f50c38dc070f4bb515c1b64450dae14f316474e
1// Copyright (c) 2009 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#pragma once
8
9#include <vector>
10
11#include "base/lock.h"
12#include "base/threading/thread.h"
13
14// This class provides the following functionality:
15// It invokes a set of registered handlers at periodic intervals in
16// the context of an arbitrary worker thread.
17// The timer runs on a separate thread, so it will run even if the current
18// thread is hung. Similarly, the callbacks will be called on a separate
19// thread so they won't block the main thread.
20class WorkerThreadTicker {
21 public:
22  // This callback interface to be implemented by clients of this
23  // class
24  class Callback {
25   public:
26    // Gets invoked when the timer period is up
27    virtual void OnTick() = 0;
28
29   protected:
30    virtual ~Callback() {}
31  };
32
33  // tick_interval is the periodic interval in which to invoke the
34  // registered handlers (in milliseconds)
35  explicit WorkerThreadTicker(int tick_interval);
36
37  ~WorkerThreadTicker();
38
39  // Registers a callback handler interface
40  // tick_handler is the handler interface to register. The ownership of this
41  // object is not transferred to this class.
42  bool RegisterTickHandler(Callback *tick_handler);
43
44  // Unregisters a callback handler interface
45  // tick_handler is the handler interface to unregister
46  bool UnregisterTickHandler(Callback *tick_handler);
47
48  // Starts the ticker. Returns false if the ticker is already running
49  // or if the Start fails.
50  bool Start();
51  // Stops the ticker and waits for all callbacks. to be done. This method
52  // does not provide a way to stop without waiting for the callbacks to be
53  // done because this is inherently risky.
54  // Returns false is the ticker is not running
55  bool Stop();
56  bool IsRunning() const {
57    return is_running_;
58  }
59
60  void set_tick_interval(int tick_interval) {
61    tick_interval_ = tick_interval;
62  }
63
64  int tick_interval() const {
65    return tick_interval_;
66  }
67
68 private:
69  class TimerTask;
70
71  void ScheduleTimerTask();
72
73  // A list type that holds all registered callback interfaces
74  typedef std::vector<Callback*> TickHandlerListType;
75
76  // Lock to protect is_running_ and tick_handler_list_
77  Lock lock_;
78
79  base::Thread timer_thread_;
80  bool is_running_;
81
82  // The interval at which the callbacks are to be invoked
83  int tick_interval_;
84
85  // A list that holds all registered callback interfaces
86  TickHandlerListType tick_handler_list_;
87
88  DISALLOW_COPY_AND_ASSIGN(WorkerThreadTicker);
89};
90
91#endif  // CHROME_COMMON_WORKER_THREAD_TICKER_H_
92