| Index: third_party/crashpad/crashpad/test/win/win_multiprocess.h
|
| diff --git a/third_party/crashpad/crashpad/test/win/win_multiprocess.h b/third_party/crashpad/crashpad/test/win/win_multiprocess.h
|
| index 663c7594b4323b7b523ce35abf379167dde80277..b9e1564c9c2987118e6de9c2a74e38240e52418e 100644
|
| --- a/third_party/crashpad/crashpad/test/win/win_multiprocess.h
|
| +++ b/third_party/crashpad/crashpad/test/win/win_multiprocess.h
|
| @@ -43,12 +43,16 @@ class WinMultiprocess {
|
| ASSERT_NO_FATAL_FAILURE(
|
| WinChildProcess::EntryPoint<ChildProcessHelper<T>>());
|
| // If WinChildProcess::EntryPoint returns, we are in the parent process.
|
| + T parent_process;
|
| + WinMultiprocess* parent_multiprocess = &parent_process;
|
| +
|
| + parent_multiprocess->WinMultiprocessParentBeforeChild();
|
| +
|
| std::unique_ptr<WinChildProcess::Handles> child_handles =
|
| WinChildProcess::Launch();
|
| ASSERT_TRUE(child_handles.get());
|
| - T parent_process;
|
| parent_process.child_handles_ = child_handles.get();
|
| - static_cast<WinMultiprocess*>(&parent_process)->WinMultiprocessParent();
|
| + parent_multiprocess->WinMultiprocessParent();
|
|
|
| // Close our side of the handles now that we're done. The child can
|
| // use this to know when it's safe to complete.
|
| @@ -56,12 +60,15 @@ class WinMultiprocess {
|
| child_handles->write.reset();
|
|
|
| // Wait for the child to complete.
|
| - ASSERT_EQ(WAIT_OBJECT_0,
|
| - WaitForSingleObject(child_handles->process.get(), INFINITE));
|
| + ASSERT_EQ(WaitForSingleObject(child_handles->process.get(), INFINITE),
|
| + WAIT_OBJECT_0);
|
|
|
| DWORD exit_code;
|
| ASSERT_TRUE(GetExitCodeProcess(child_handles->process.get(), &exit_code));
|
| - ASSERT_EQ(parent_process.exit_code_, exit_code);
|
| + ASSERT_EQ(exit_code, parent_process.exit_code_);
|
| +
|
| + parent_multiprocess->WinMultiprocessParentAfterChild(
|
| + child_handles->process.get());
|
| }
|
|
|
| protected:
|
| @@ -162,6 +169,20 @@ class WinMultiprocess {
|
| //! Subclasses must implement this method to define how the parent operates.
|
| virtual void WinMultiprocessParent() = 0;
|
|
|
| + //! \brief The optional routine run in parent before the child is spawned.
|
| + //!
|
| + //! Subclasses may implement this method to prepare the environment for
|
| + //! the child process.
|
| + virtual void WinMultiprocessParentBeforeChild() {}
|
| +
|
| + //! \brief The optional routine run in parent after the child exits.
|
| + //!
|
| + //! Subclasses may implement this method to clean up the environment after
|
| + //! the child process has exited.
|
| + //!
|
| + //! \param[in] child A handle to the exited child process.
|
| + virtual void WinMultiprocessParentAfterChild(HANDLE child) {}
|
| +
|
| //! \brief The subclass-provided child routine.
|
| //!
|
| //! Test failures should be reported via gtest: `EXPECT_*()`, `ASSERT_*()`,
|
|
|