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

Side by Side Diff: chrome/gpu/gpu_watchdog_thread.cc

Issue 5301007: Fixed null dereference in GPU watchdog termination code.... (Closed) Base URL: svn://chrome-svn/chrome/trunk/src/
Patch Set: Created 10 years 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 | no next file » | 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) 2010 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2010 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 #if defined(OS_WIN) 5 #if defined(OS_WIN)
6 #include <windows.h> 6 #include <windows.h>
7 #endif 7 #endif
8 8
9 #include "chrome/gpu/gpu_watchdog_thread.h" 9 #include "chrome/gpu/gpu_watchdog_thread.h"
10 10
(...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after
52 method_factory_.reset(new MethodFactory(this)); 52 method_factory_.reset(new MethodFactory(this));
53 53
54 // Schedule the first check. 54 // Schedule the first check.
55 OnCheck(); 55 OnCheck();
56 } 56 }
57 57
58 void GpuWatchdogThread::CleanUp() { 58 void GpuWatchdogThread::CleanUp() {
59 // The method factory must be destroyed on the watchdog thread. 59 // The method factory must be destroyed on the watchdog thread.
60 method_factory_->RevokeAll(); 60 method_factory_->RevokeAll();
61 method_factory_.reset(); 61 method_factory_.reset();
62
63 // Prevent any more delayed tasks from being posted.
64 watched_message_loop_ = NULL;
apatrick_chromium 2010/11/29 22:00:14 I don't think this was actually needed.
65 } 62 }
66 63
67 GpuWatchdogThread::GpuWatchdogTaskObserver::GpuWatchdogTaskObserver( 64 GpuWatchdogThread::GpuWatchdogTaskObserver::GpuWatchdogTaskObserver(
68 GpuWatchdogThread* watchdog) 65 GpuWatchdogThread* watchdog)
69 : watchdog_(watchdog) { 66 : watchdog_(watchdog) {
70 } 67 }
71 68
72 GpuWatchdogThread::GpuWatchdogTaskObserver::~GpuWatchdogTaskObserver() { 69 GpuWatchdogThread::GpuWatchdogTaskObserver::~GpuWatchdogTaskObserver() {
73 } 70 }
74 71
(...skipping 24 matching lines...) Expand all
99 // watched thread to see armed_ being true multiple times before 96 // watched thread to see armed_ being true multiple times before
100 // the OnAcknowledge task is run on the watchdog thread. 97 // the OnAcknowledge task is run on the watchdog thread.
101 if (!armed_) 98 if (!armed_)
102 return; 99 return;
103 100
104 // Revoke any pending OnExit. 101 // Revoke any pending OnExit.
105 method_factory_->RevokeAll(); 102 method_factory_->RevokeAll();
106 armed_ = false; 103 armed_ = false;
107 104
108 // The monitored thread has responded. Post a task to check it again. 105 // The monitored thread has responded. Post a task to check it again.
109 if (watched_message_loop_) { 106 message_loop()->PostDelayedTask(
110 message_loop()->PostDelayedTask( 107 FROM_HERE,
111 FROM_HERE, 108 method_factory_->NewRunnableMethod(&GpuWatchdogThread::OnCheck),
112 method_factory_->NewRunnableMethod(&GpuWatchdogThread::OnCheck), 109 kCheckPeriod);
113 kCheckPeriod);
114 }
115 } 110 }
116 111
117 void GpuWatchdogThread::OnCheck() { 112 void GpuWatchdogThread::OnCheck() {
118 if (watched_message_loop_) { 113 // Must set armed before posting the task. This task might be the only task
119 // Must set armed before posting the task. This task might be the only task 114 // that will activate the TaskObserver on the watched thread and it must not
120 // that will activate the TaskObserver on the watched thread and it must not 115 // miss the false -> true transition.
121 // miss the false -> true transition. 116 armed_ = true;
122 armed_ = true;
123 117
124 // Post a task to the monitored thread that does nothing but wake up the 118 // Post a task to the monitored thread that does nothing but wake up the
125 // TaskObserver. Any other tasks that are pending on the watched thread will 119 // TaskObserver. Any other tasks that are pending on the watched thread will
126 // also wake up the observer. This simply ensures there is at least one. 120 // also wake up the observer. This simply ensures there is at least one.
127 watched_message_loop_->PostTask( 121 watched_message_loop_->PostTask(
128 FROM_HERE, 122 FROM_HERE,
129 NewRunnableFunction(DoNothing)); 123 NewRunnableFunction(DoNothing));
130 124
131 // Post a task to the watchdog thread to exit if the monitored thread does 125 // Post a task to the watchdog thread to exit if the monitored thread does
132 // not respond in time. 126 // not respond in time.
133 message_loop()->PostDelayedTask( 127 message_loop()->PostDelayedTask(
134 FROM_HERE, 128 FROM_HERE,
135 method_factory_->NewRunnableMethod(&GpuWatchdogThread::OnExit), 129 method_factory_->NewRunnableMethod(&GpuWatchdogThread::OnExit),
136 timeout_); 130 timeout_);
137 }
138 } 131 }
139 132
140 // Use the --disable-gpu-watchdog command line switch to disable this. 133 // Use the --disable-gpu-watchdog command line switch to disable this.
141 void GpuWatchdogThread::OnExit() { 134 void GpuWatchdogThread::OnExit() {
142 // Make sure the timeout period is on the stack before crashing. 135 // Make sure the timeout period is on the stack before crashing.
143 volatile int timeout = timeout_; 136 volatile int timeout = timeout_;
144 137
145 // For minimal developer annoyance, don't keep crashing. 138 // For minimal developer annoyance, don't keep crashing.
146 static bool crashed = false; 139 static bool crashed = false;
147 if (crashed) 140 if (crashed)
148 return; 141 return;
149 142
150 #if defined(OS_WIN) 143 #if defined(OS_WIN)
151 if (IsDebuggerPresent()) 144 if (IsDebuggerPresent())
152 return; 145 return;
153 #endif 146 #endif
154 147
155 LOG(ERROR) << "The GPU process hung. Restarting after " 148 LOG(ERROR) << "The GPU process hung. Restarting after "
156 << timeout_ << " seconds."; 149 << timeout_ << " seconds.";
157 150
158 volatile int* null_pointer = NULL; 151 volatile int* null_pointer = NULL;
159 *null_pointer = timeout; 152 *null_pointer = timeout;
160 153
161 crashed = true; 154 crashed = true;
162 } 155 }
OLDNEW
« no previous file with comments | « no previous file | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698