| OLD | NEW |
| 1 // Copyright 2015 The Crashpad Authors. All rights reserved. | 1 // Copyright 2015 The Crashpad Authors. All rights reserved. |
| 2 // | 2 // |
| 3 // Licensed under the Apache License, Version 2.0 (the "License"); | 3 // Licensed under the Apache License, Version 2.0 (the "License"); |
| 4 // you may not use this file except in compliance with the License. | 4 // you may not use this file except in compliance with the License. |
| 5 // You may obtain a copy of the License at | 5 // You may obtain a copy of the License at |
| 6 // | 6 // |
| 7 // http://www.apache.org/licenses/LICENSE-2.0 | 7 // http://www.apache.org/licenses/LICENSE-2.0 |
| 8 // | 8 // |
| 9 // Unless required by applicable law or agreed to in writing, software | 9 // Unless required by applicable law or agreed to in writing, software |
| 10 // distributed under the License is distributed on an "AS IS" BASIS, | 10 // distributed under the License is distributed on an "AS IS" BASIS, |
| (...skipping 147 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 158 char c = ' '; | 158 char c = ' '; |
| 159 CheckedWriteFile(WritePipeHandle(), &c, sizeof(c)); | 159 CheckedWriteFile(WritePipeHandle(), &c, sizeof(c)); |
| 160 } | 160 } |
| 161 | 161 |
| 162 // static | 162 // static |
| 163 bool WinChildProcess::IsChildProcess() { | 163 bool WinChildProcess::IsChildProcess() { |
| 164 return GetSwitch(kIsMultiprocessChild, nullptr); | 164 return GetSwitch(kIsMultiprocessChild, nullptr); |
| 165 } | 165 } |
| 166 | 166 |
| 167 // static | 167 // static |
| 168 scoped_ptr<WinChildProcess::Handles> WinChildProcess::Launch() { | 168 std::unique_ptr<WinChildProcess::Handles> WinChildProcess::Launch() { |
| 169 // Make pipes for child-to-parent and parent-to-child communication. | 169 // Make pipes for child-to-parent and parent-to-child communication. |
| 170 scoped_ptr<Handles> handles_for_parent(new Handles); | 170 std::unique_ptr<Handles> handles_for_parent(new Handles); |
| 171 ScopedFileHANDLE read_for_child; | 171 ScopedFileHANDLE read_for_child; |
| 172 ScopedFileHANDLE write_for_child; | 172 ScopedFileHANDLE write_for_child; |
| 173 | 173 |
| 174 if (!CreateInheritablePipe( | 174 if (!CreateInheritablePipe( |
| 175 &handles_for_parent->read, false, &write_for_child, true)) { | 175 &handles_for_parent->read, false, &write_for_child, true)) { |
| 176 return scoped_ptr<Handles>(); | 176 return std::unique_ptr<Handles>(); |
| 177 } | 177 } |
| 178 | 178 |
| 179 if (!CreateInheritablePipe( | 179 if (!CreateInheritablePipe( |
| 180 &read_for_child, true, &handles_for_parent->write, false)) { | 180 &read_for_child, true, &handles_for_parent->write, false)) { |
| 181 return scoped_ptr<Handles>(); | 181 return std::unique_ptr<Handles>(); |
| 182 } | 182 } |
| 183 | 183 |
| 184 // Build a command line for the child process that tells it only to run the | 184 // Build a command line for the child process that tells it only to run the |
| 185 // current test, and to pass down the values of the pipe handles. | 185 // current test, and to pass down the values of the pipe handles. |
| 186 const ::testing::TestInfo* const test_info = | 186 const ::testing::TestInfo* const test_info = |
| 187 ::testing::UnitTest::GetInstance()->current_test_info(); | 187 ::testing::UnitTest::GetInstance()->current_test_info(); |
| 188 std::wstring command_line = | 188 std::wstring command_line = |
| 189 Paths::Executable().value() + L" " + | 189 Paths::Executable().value() + L" " + |
| 190 base::UTF8ToUTF16(base::StringPrintf("--gtest_filter=%s.%s %s=0x%x|0x%x", | 190 base::UTF8ToUTF16(base::StringPrintf("--gtest_filter=%s.%s %s=0x%x|0x%x", |
| 191 test_info->test_case_name(), | 191 test_info->test_case_name(), |
| 192 test_info->name(), | 192 test_info->name(), |
| 193 kIsMultiprocessChild, | 193 kIsMultiprocessChild, |
| 194 HandleToInt(write_for_child.get()), | 194 HandleToInt(write_for_child.get()), |
| 195 HandleToInt(read_for_child.get()))); | 195 HandleToInt(read_for_child.get()))); |
| 196 | 196 |
| 197 // Command-line buffer cannot be constant, per CreateProcess signature. | 197 // Command-line buffer cannot be constant, per CreateProcess signature. |
| 198 handles_for_parent->process = LaunchCommandLine(&command_line[0]); | 198 handles_for_parent->process = LaunchCommandLine(&command_line[0]); |
| 199 if (!handles_for_parent->process.is_valid()) | 199 if (!handles_for_parent->process.is_valid()) |
| 200 return scoped_ptr<Handles>(); | 200 return std::unique_ptr<Handles>(); |
| 201 | 201 |
| 202 // Block until the child process has launched. CreateProcess() returns | 202 // Block until the child process has launched. CreateProcess() returns |
| 203 // immediately, and test code expects process initialization to have | 203 // immediately, and test code expects process initialization to have |
| 204 // completed so it can, for example, read the process memory. | 204 // completed so it can, for example, read the process memory. |
| 205 char c; | 205 char c; |
| 206 if (!LoggingReadFile(handles_for_parent->read.get(), &c, sizeof(c))) { | 206 if (!LoggingReadFile(handles_for_parent->read.get(), &c, sizeof(c))) { |
| 207 ADD_FAILURE() << "LoggedReadFile"; | 207 ADD_FAILURE() << "LoggedReadFile"; |
| 208 return scoped_ptr<Handles>(); | 208 return std::unique_ptr<Handles>(); |
| 209 } | 209 } |
| 210 | 210 |
| 211 if (c != ' ') { | 211 if (c != ' ') { |
| 212 ADD_FAILURE() << "invalid data read from child"; | 212 ADD_FAILURE() << "invalid data read from child"; |
| 213 return scoped_ptr<Handles>(); | 213 return std::unique_ptr<Handles>(); |
| 214 } | 214 } |
| 215 | 215 |
| 216 return std::move(handles_for_parent); | 216 return std::move(handles_for_parent); |
| 217 } | 217 } |
| 218 | 218 |
| 219 FileHandle WinChildProcess::ReadPipeHandle() const { | 219 FileHandle WinChildProcess::ReadPipeHandle() const { |
| 220 return pipe_read_.get(); | 220 return pipe_read_.get(); |
| 221 } | 221 } |
| 222 | 222 |
| 223 FileHandle WinChildProcess::WritePipeHandle() const { | 223 FileHandle WinChildProcess::WritePipeHandle() const { |
| 224 return pipe_write_.get(); | 224 return pipe_write_.get(); |
| 225 } | 225 } |
| 226 | 226 |
| 227 void WinChildProcess::CloseReadPipe() { | 227 void WinChildProcess::CloseReadPipe() { |
| 228 pipe_read_.reset(); | 228 pipe_read_.reset(); |
| 229 } | 229 } |
| 230 | 230 |
| 231 void WinChildProcess::CloseWritePipe() { | 231 void WinChildProcess::CloseWritePipe() { |
| 232 pipe_write_.reset(); | 232 pipe_write_.reset(); |
| 233 } | 233 } |
| 234 | 234 |
| 235 } // namespace test | 235 } // namespace test |
| 236 } // namespace crashpad | 236 } // namespace crashpad |
| OLD | NEW |