| Index: net/test/test_server_win.cc
|
| ===================================================================
|
| --- net/test/test_server_win.cc (revision 99780)
|
| +++ net/test/test_server_win.cc (working copy)
|
| @@ -23,59 +23,6 @@
|
|
|
| namespace {
|
|
|
| -bool LaunchTestServerAsJob(const CommandLine& cmdline,
|
| - bool start_hidden,
|
| - base::ProcessHandle* process_handle,
|
| - base::win::ScopedHandle* job_handle) {
|
| - // Launch test server process.
|
| - STARTUPINFO startup_info = {0};
|
| - startup_info.cb = sizeof(startup_info);
|
| - startup_info.dwFlags = STARTF_USESHOWWINDOW;
|
| - startup_info.wShowWindow = start_hidden ? SW_HIDE : SW_SHOW;
|
| - PROCESS_INFORMATION process_info;
|
| -
|
| - // If this code is run under a debugger, the test server process is
|
| - // automatically associated with a job object created by the debugger.
|
| - // The CREATE_BREAKAWAY_FROM_JOB flag is used to prevent this.
|
| - if (!CreateProcess(
|
| - NULL, const_cast<wchar_t*>(cmdline.GetCommandLineString().c_str()),
|
| - NULL, NULL, TRUE, CREATE_BREAKAWAY_FROM_JOB, NULL, NULL,
|
| - &startup_info, &process_info)) {
|
| - LOG(ERROR) << "Could not create process.";
|
| - return false;
|
| - }
|
| - CloseHandle(process_info.hThread);
|
| -
|
| - // If the caller wants the process handle, we won't close it.
|
| - if (process_handle) {
|
| - *process_handle = process_info.hProcess;
|
| - } else {
|
| - CloseHandle(process_info.hProcess);
|
| - }
|
| -
|
| - // Create a JobObject and associate the test server process with it.
|
| - job_handle->Set(CreateJobObject(NULL, NULL));
|
| - if (!job_handle->IsValid()) {
|
| - LOG(ERROR) << "Could not create JobObject.";
|
| - return false;
|
| - } else {
|
| - JOBOBJECT_EXTENDED_LIMIT_INFORMATION limit_info = {0};
|
| - limit_info.BasicLimitInformation.LimitFlags =
|
| - JOB_OBJECT_LIMIT_KILL_ON_JOB_CLOSE;
|
| - if (0 == SetInformationJobObject(job_handle->Get(),
|
| - JobObjectExtendedLimitInformation, &limit_info, sizeof(limit_info))) {
|
| - LOG(ERROR) << "Could not SetInformationJobObject.";
|
| - return false;
|
| - }
|
| - if (0 == AssignProcessToJobObject(job_handle->Get(),
|
| - process_info.hProcess)) {
|
| - LOG(ERROR) << "Could not AssignProcessToObject.";
|
| - return false;
|
| - }
|
| - }
|
| - return true;
|
| -}
|
| -
|
| // Writes |size| bytes to |handle| and sets |*unblocked| to true.
|
| // Used as a crude timeout mechanism by ReadData().
|
| void UnblockPipe(HANDLE handle, DWORD size, bool* unblocked) {
|
| @@ -179,10 +126,25 @@
|
| python_command.AppendArg("--startup-pipe=" +
|
| base::IntToString(reinterpret_cast<uintptr_t>(child_write)));
|
|
|
| - if (!LaunchTestServerAsJob(python_command,
|
| - true,
|
| - &process_handle_,
|
| - &job_handle_)) {
|
| + job_handle_.Set(CreateJobObject(NULL, NULL));
|
| + if (!job_handle_.IsValid()) {
|
| + LOG(ERROR) << "Could not create JobObject.";
|
| + return false;
|
| + }
|
| +
|
| + JOBOBJECT_EXTENDED_LIMIT_INFORMATION limit_info = {0};
|
| + limit_info.BasicLimitInformation.LimitFlags =
|
| + JOB_OBJECT_LIMIT_KILL_ON_JOB_CLOSE;
|
| + if (0 == SetInformationJobObject(job_handle_.Get(),
|
| + JobObjectExtendedLimitInformation, &limit_info, sizeof(limit_info))) {
|
| + LOG(ERROR) << "Could not SetInformationJobObject.";
|
| + return false;
|
| + }
|
| +
|
| + base::LaunchOptions launch_options;
|
| + launch_options.inherit_handles = true;
|
| + launch_options.job_handle = job_handle_.Get();
|
| + if (!base::LaunchProcess(python_command, launch_options, &process_handle_)) {
|
| LOG(ERROR) << "Failed to launch " << python_command.GetCommandLineString();
|
| return false;
|
| }
|
|
|