summaryrefslogtreecommitdiffstats
path: root/ui/surface/accelerated_surface_win.cc
diff options
context:
space:
mode:
authorapatrick@chromium.org <apatrick@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2013-03-29 01:31:43 +0000
committerapatrick@chromium.org <apatrick@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2013-03-29 01:31:43 +0000
commitf91f7486bbbf37710726d9e58703fb1240cac727 (patch)
treea175615168b1f3952536bc04025eb7ae1e7f5ed1 /ui/surface/accelerated_surface_win.cc
parentabaca60571344ee85d1bd134cb05b113c7dcc4fa (diff)
downloadchromium_src-f91f7486bbbf37710726d9e58703fb1240cac727.zip
chromium_src-f91f7486bbbf37710726d9e58703fb1240cac727.tar.gz
chromium_src-f91f7486bbbf37710726d9e58703fb1240cac727.tar.bz2
Windows: AcceleratedPresenter takes present thread lock before reseting its D3D device.
I also added some asserts to PresentThread to prevent this from happening in the future. Review URL: https://chromiumcodereview.appspot.com/12798009 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@191257 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'ui/surface/accelerated_surface_win.cc')
-rw-r--r--ui/surface/accelerated_surface_win.cc14
1 files changed, 13 insertions, 1 deletions
diff --git a/ui/surface/accelerated_surface_win.cc b/ui/surface/accelerated_surface_win.cc
index 92d81d2..10487d3 100644
--- a/ui/surface/accelerated_surface_win.cc
+++ b/ui/surface/accelerated_surface_win.cc
@@ -82,6 +82,7 @@ class PresentThread : public base::Thread,
}
void InitDevice();
+ void LockAndResetDevice();
void ResetDevice();
bool IsDeviceLost();
@@ -162,6 +163,8 @@ PresentThread::PresentThread(const char* name) : base::Thread(name) {
}
void PresentThread::InitDevice() {
+ lock_.AssertAcquired();
+
if (device_)
return;
@@ -170,9 +173,16 @@ void PresentThread::InitDevice() {
ResetDevice();
}
+void PresentThread::LockAndResetDevice() {
+ base::AutoLock locked(lock_);
+ ResetDevice();
+}
+
void PresentThread::ResetDevice() {
TRACE_EVENT0("gpu", "PresentThread::ResetDevice");
+ lock_.AssertAcquired();
+
// The D3D device must be created on the present thread.
CHECK(message_loop() == MessageLoop::current());
@@ -207,6 +217,8 @@ void PresentThread::ResetDevice() {
}
bool PresentThread::IsDeviceLost() {
+ lock_.AssertAcquired();
+
HRESULT hr = device_->CheckDeviceState(NULL);
return FAILED(hr) || hr == S_PRESENT_MODE_CHANGED;
}
@@ -911,7 +923,7 @@ void AcceleratedPresenter::PresentWithGDI(HDC dc) {
if (present_thread_->IsDeviceLost()) {
present_thread_->message_loop()->PostTask(
FROM_HERE,
- base::Bind(&PresentThread::ResetDevice, present_thread_));
+ base::Bind(&PresentThread::LockAndResetDevice, present_thread_));
}
return;
}