Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(159)

Side by Side Diff: base/threading/watchdog.h

Issue 9173002: Watchdog - Added a JOINABLE state to avoid StartupTimebomb (Closed) Base URL: svn://chrome-svn/chrome/trunk/src/
Patch Set: '' Created 8 years, 11 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « no previous file | base/threading/watchdog.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. 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 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 // The Watchdog class creates a second thread that can Alarm if a specific 5 // The Watchdog class creates a second thread that can Alarm if a specific
6 // duration of time passes without proper attention. The duration of time is 6 // duration of time passes without proper attention. The duration of time is
7 // specified at construction time. The Watchdog may be used many times by 7 // specified at construction time. The Watchdog may be used many times by
8 // simply calling Arm() (to start timing) and Disarm() (to reset the timer). 8 // simply calling Arm() (to start timing) and Disarm() (to reset the timer).
9 // The Watchdog is typically used under a debugger, where the stack traces on 9 // The Watchdog is typically used under a debugger, where the stack traces on
10 // other threads can be examined if/when the Watchdog alarms. 10 // other threads can be examined if/when the Watchdog alarms.
11 11
(...skipping 19 matching lines...) Expand all
31 namespace base { 31 namespace base {
32 32
33 class BASE_EXPORT Watchdog { 33 class BASE_EXPORT Watchdog {
34 public: 34 public:
35 // Constructor specifies how long the Watchdog will wait before alarming. 35 // Constructor specifies how long the Watchdog will wait before alarming.
36 Watchdog(const TimeDelta& duration, 36 Watchdog(const TimeDelta& duration,
37 const std::string& thread_watched_name, 37 const std::string& thread_watched_name,
38 bool enabled); 38 bool enabled);
39 virtual ~Watchdog(); 39 virtual ~Watchdog();
40 40
41 // Notify watchdog thread to finish up. Sets the state_ to SHUTDOWN.
42 void Cleanup();
43
44 // Returns true if we state_ is JOINABLE (which indicates that Watchdog has
45 // exited).
46 bool IsJoinable();
47
41 // Start timing, and alarm when time expires (unless we're disarm()ed.) 48 // Start timing, and alarm when time expires (unless we're disarm()ed.)
42 void Arm(); // Arm starting now. 49 void Arm(); // Arm starting now.
43 void ArmSomeTimeDeltaAgo(const TimeDelta& time_delta); 50 void ArmSomeTimeDeltaAgo(const TimeDelta& time_delta);
44 void ArmAtStartTime(const TimeTicks start_time); 51 void ArmAtStartTime(const TimeTicks start_time);
45 52
46 // Reset time, and do not set off the alarm. 53 // Reset time, and do not set off the alarm.
47 void Disarm(); 54 void Disarm();
48 55
49 // Alarm is called if the time expires after an Arm() without someone calling 56 // Alarm is called if the time expires after an Arm() without someone calling
50 // Disarm(). This method can be overridden to create testable classes. 57 // Disarm(). This method can be overridden to create testable classes.
51 virtual void Alarm(); 58 virtual void Alarm();
52 59
53 // Reset static data to initial state. Useful for tests, to ensure 60 // Reset static data to initial state. Useful for tests, to ensure
54 // they are independent. 61 // they are independent.
55 static void ResetStaticData(); 62 static void ResetStaticData();
56 63
57 private: 64 private:
58 class ThreadDelegate : public PlatformThread::Delegate { 65 class ThreadDelegate : public PlatformThread::Delegate {
59 public: 66 public:
60 explicit ThreadDelegate(Watchdog* watchdog) : watchdog_(watchdog) { 67 explicit ThreadDelegate(Watchdog* watchdog) : watchdog_(watchdog) {
61 } 68 }
62 virtual void ThreadMain() OVERRIDE; 69 virtual void ThreadMain() OVERRIDE;
63 private: 70 private:
64 void SetThreadName() const; 71 void SetThreadName() const;
65 72
66 Watchdog* watchdog_; 73 Watchdog* watchdog_;
67 }; 74 };
68 75
69 enum State {ARMED, DISARMED, SHUTDOWN }; 76 enum State {ARMED, DISARMED, SHUTDOWN, JOINABLE };
70 77
71 bool init_successful_; 78 bool enabled_;
72 79
73 Lock lock_; // Mutex for state_. 80 Lock lock_; // Mutex for state_.
74 ConditionVariable condition_variable_; 81 ConditionVariable condition_variable_;
75 State state_; 82 State state_;
76 const TimeDelta duration_; // How long after start_time_ do we alarm? 83 const TimeDelta duration_; // How long after start_time_ do we alarm?
77 const std::string thread_watched_name_; 84 const std::string thread_watched_name_;
78 PlatformThreadHandle handle_; 85 PlatformThreadHandle handle_;
79 ThreadDelegate delegate_; // Store it, because it must outlive the thread. 86 ThreadDelegate delegate_; // Store it, because it must outlive the thread.
80 87
81 TimeTicks start_time_; // Start of epoch, and alarm after duration_. 88 TimeTicks start_time_; // Start of epoch, and alarm after duration_.
82 89
83 DISALLOW_COPY_AND_ASSIGN(Watchdog); 90 DISALLOW_COPY_AND_ASSIGN(Watchdog);
84 }; 91 };
85 92
86 } // namespace base 93 } // namespace base
87 94
88 #endif // BASE_THREADING_WATCHDOG_H_ 95 #endif // BASE_THREADING_WATCHDOG_H_
OLDNEW
« no previous file with comments | « no previous file | base/threading/watchdog.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698