| Index: chrome/test/chrome_process_util.cc
|
| diff --git a/chrome/test/chrome_process_util.cc b/chrome/test/chrome_process_util.cc
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..128ec336cd6c8df6999065b25f536f899b8bb304
|
| --- /dev/null
|
| +++ b/chrome/test/chrome_process_util.cc
|
| @@ -0,0 +1,50 @@
|
| +// Copyright (c) 2009 The Chromium Authors. All rights reserved.
|
| +// Use of this source code is governed by a BSD-style license that can be
|
| +// found in the LICENSE file.
|
| +
|
| +#include "chrome/test/chrome_process_util.h"
|
| +
|
| +#include <vector>
|
| +
|
| +#include "base/process_util.h"
|
| +#include "base/time.h"
|
| +#include "chrome/common/result_codes.h"
|
| +
|
| +using base::Time;
|
| +using base::TimeDelta;
|
| +
|
| +void TerminateAllChromeProcesses(const FilePath& data_dir) {
|
| + // Total time the function will wait for chrome processes
|
| + // to terminate after it told them to do so.
|
| + const TimeDelta kExitTimeout = TimeDelta::FromMilliseconds(5000);
|
| +
|
| + ChromeProcessList process_pids(GetRunningChromeProcesses(data_dir));
|
| +
|
| + std::vector<base::ProcessHandle> handles;
|
| + {
|
| + ChromeProcessList::const_iterator it;
|
| + for (it = process_pids.begin(); it != process_pids.end(); ++it) {
|
| + base::ProcessHandle handle;
|
| + // Ignore processes for which we can't open the handle. We don't guarantee
|
| + // that all processes will terminate, only try to do so.
|
| + if (base::OpenProcessHandle(*it, &handle))
|
| + handles.push_back(handle);
|
| + }
|
| + }
|
| +
|
| + std::vector<base::ProcessHandle>::const_iterator it;
|
| + for (it = handles.begin(); it != handles.end(); ++it)
|
| + base::KillProcess(*it, ResultCodes::TASKMAN_KILL, false);
|
| +
|
| + const Time start = Time::Now();
|
| + for (it = handles.begin();
|
| + it != handles.end() && Time::Now() - start < kExitTimeout;
|
| + ++it) {
|
| + // TODO(phajdan.jr): Fix int/int64 problems with TimeDelta::InMilliseconds.
|
| + int wait_time_ms = static_cast<int>((Time::Now() - start).InMilliseconds());
|
| + base::WaitForSingleProcess(*it, wait_time_ms);
|
| + }
|
| +
|
| + for (it = handles.begin(); it != handles.end(); ++it)
|
| + base::CloseProcessHandle(*it);
|
| +}
|
|
|