OLD | NEW |
1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2011 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 #include "chrome_frame/vtable_patch_manager.h" | 5 #include "chrome_frame/vtable_patch_manager.h" |
6 | 6 |
7 #include <unknwn.h> | 7 #include <unknwn.h> |
8 | 8 |
9 #include "base/bind.h" | 9 #include "base/bind.h" |
10 #include "base/bind_helpers.h" | 10 #include "base/bind_helpers.h" |
(...skipping 203 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
214 | 214 |
215 EXPECT_TRUE(background.Start()); | 215 EXPECT_TRUE(background.Start()); |
216 base::win::ScopedHandle event(::CreateEvent(NULL, TRUE, FALSE, NULL)); | 216 base::win::ScopedHandle event(::CreateEvent(NULL, TRUE, FALSE, NULL)); |
217 | 217 |
218 // Grab the patch lock. | 218 // Grab the patch lock. |
219 vtable_patch::patch_lock_.Acquire(); | 219 vtable_patch::patch_lock_.Acquire(); |
220 | 220 |
221 // Instruct the background thread to patch factory_. | 221 // Instruct the background thread to patch factory_. |
222 background.message_loop()->PostTask( | 222 background.message_loop()->PostTask( |
223 FROM_HERE, | 223 FROM_HERE, |
224 base::IgnoreReturn<HRESULT>( | 224 base::Bind(base::IgnoreResult(&vtable_patch::PatchInterfaceMethods), |
225 base::Bind(&vtable_patch::PatchInterfaceMethods, &factory_, | 225 &factory_, &IClassFactory_PatchInfo[0])); |
226 &IClassFactory_PatchInfo[0]))); | |
227 | 226 |
228 // And subsequently to signal the event. Neither of these actions should | 227 // And subsequently to signal the event. Neither of these actions should |
229 // occur until we've released the patch lock. | 228 // occur until we've released the patch lock. |
230 background.message_loop()->PostTask( | 229 background.message_loop()->PostTask( |
231 FROM_HERE, base::IgnoreReturn<BOOL>(base::Bind(::SetEvent, event.Get()))); | 230 FROM_HERE, base::Bind(base::IgnoreResult(::SetEvent), event.Get())); |
232 | 231 |
233 // Wait for a little while, to give the background thread time to process. | 232 // Wait for a little while, to give the background thread time to process. |
234 // We expect this wait to time out, as the background thread should end up | 233 // We expect this wait to time out, as the background thread should end up |
235 // blocking on the patch lock. | 234 // blocking on the patch lock. |
236 EXPECT_EQ(WAIT_TIMEOUT, ::WaitForSingleObject(event.Get(), 50)); | 235 EXPECT_EQ(WAIT_TIMEOUT, ::WaitForSingleObject(event.Get(), 50)); |
237 | 236 |
238 // Verify that patching did not take place yet. | 237 // Verify that patching did not take place yet. |
239 EXPECT_CALL(factory_, LockServer(TRUE)) | 238 EXPECT_CALL(factory_, LockServer(TRUE)) |
240 .WillOnce(Return(S_FALSE)); | 239 .WillOnce(Return(S_FALSE)); |
241 EXPECT_EQ(S_FALSE, factory_.LockServer(TRUE)); | 240 EXPECT_EQ(S_FALSE, factory_.LockServer(TRUE)); |
(...skipping 14 matching lines...) Expand all Loading... |
256 | 255 |
257 // Same deal for unpatching. | 256 // Same deal for unpatching. |
258 ::ResetEvent(event.Get()); | 257 ::ResetEvent(event.Get()); |
259 | 258 |
260 // Grab the patch lock. | 259 // Grab the patch lock. |
261 vtable_patch::patch_lock_.Acquire(); | 260 vtable_patch::patch_lock_.Acquire(); |
262 | 261 |
263 // Instruct the background thread to unpatch. | 262 // Instruct the background thread to unpatch. |
264 background.message_loop()->PostTask( | 263 background.message_loop()->PostTask( |
265 FROM_HERE, | 264 FROM_HERE, |
266 base::IgnoreReturn<HRESULT>( | 265 base::Bind(base::IgnoreResult(&vtable_patch::UnpatchInterfaceMethods), |
267 base::Bind(&vtable_patch::UnpatchInterfaceMethods, | 266 &IClassFactory_PatchInfo[0])); |
268 &IClassFactory_PatchInfo[0]))); | |
269 | 267 |
270 // And subsequently to signal the event. Neither of these actions should | 268 // And subsequently to signal the event. Neither of these actions should |
271 // occur until we've released the patch lock. | 269 // occur until we've released the patch lock. |
272 background.message_loop()->PostTask( | 270 background.message_loop()->PostTask( |
273 FROM_HERE, base::IgnoreReturn<BOOL>(base::Bind(::SetEvent, event.Get()))); | 271 FROM_HERE, base::Bind(base::IgnoreResult(::SetEvent), event.Get())); |
274 | 272 |
275 // Wait for a little while, to give the background thread time to process. | 273 // Wait for a little while, to give the background thread time to process. |
276 // We expect this wait to time out, as the background thread should end up | 274 // We expect this wait to time out, as the background thread should end up |
277 // blocking on the patch lock. | 275 // blocking on the patch lock. |
278 EXPECT_EQ(WAIT_TIMEOUT, ::WaitForSingleObject(event.Get(), 50)); | 276 EXPECT_EQ(WAIT_TIMEOUT, ::WaitForSingleObject(event.Get(), 50)); |
279 | 277 |
280 // We should still be patched. | 278 // We should still be patched. |
281 EXPECT_CALL(factory_, LockServer(TRUE)) | 279 EXPECT_CALL(factory_, LockServer(TRUE)) |
282 .Times(0); | 280 .Times(0); |
283 EXPECT_CALL(*this, LockServerPatch(_, &factory_, TRUE)) | 281 EXPECT_CALL(*this, LockServerPatch(_, &factory_, TRUE)) |
284 .WillOnce(Return(S_FALSE)); | 282 .WillOnce(Return(S_FALSE)); |
285 EXPECT_EQ(S_FALSE, factory_.LockServer(TRUE)); | 283 EXPECT_EQ(S_FALSE, factory_.LockServer(TRUE)); |
286 | 284 |
287 // Release the patch lock and wait on the event. | 285 // Release the patch lock and wait on the event. |
288 vtable_patch::patch_lock_.Release(); | 286 vtable_patch::patch_lock_.Release(); |
289 EXPECT_EQ(WAIT_OBJECT_0, ::WaitForSingleObject(event.Get(), INFINITE)); | 287 EXPECT_EQ(WAIT_OBJECT_0, ::WaitForSingleObject(event.Get(), INFINITE)); |
290 | 288 |
291 // Verify that unpatching took place. | 289 // Verify that unpatching took place. |
292 EXPECT_CALL(factory_, LockServer(TRUE)) | 290 EXPECT_CALL(factory_, LockServer(TRUE)) |
293 .WillOnce(Return(S_FALSE)); | 291 .WillOnce(Return(S_FALSE)); |
294 EXPECT_EQ(S_FALSE, factory_.LockServer(TRUE)); | 292 EXPECT_EQ(S_FALSE, factory_.LockServer(TRUE)); |
295 } | 293 } |
OLD | NEW |