Chromium Code Reviews| Index: base/process/process_handle.cc | 
| diff --git a/base/process/process_handle.cc b/base/process/process_handle.cc | 
| new file mode 100644 | 
| index 0000000000000000000000000000000000000000..ef57953007b11aee21d23c6ac1dad516286d68e0 | 
| --- /dev/null | 
| +++ b/base/process/process_handle.cc | 
| @@ -0,0 +1,53 @@ | 
| +// Copyright 2015 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 <stdint.h> | 
| + | 
| +#include "base/logging.h" | 
| +#include "base/process/process_handle.h" | 
| +#include "build/build_config.h" | 
| + | 
| +namespace base { | 
| + | 
| +namespace { | 
| +// This is never a valid mangled process ID. | 
| 
 
danakj
2015/09/23 21:56:32
This is getting kinda magical and hard to really b
 
rickyz (no longer on Chrome)
2015/09/24 01:22:03
Good idea, done
 
 | 
| +const uint32_t kInvalidUniqueId = 0xffffffffU; | 
| + | 
| +uint32_t g_unique_id = kInvalidUniqueId; | 
| + | 
| +// The process which set |g_unique_id|. | 
| +ProcessId g_procid; | 
| + | 
| +// Mangle IDs so that they are not accidentally used as PIDs, e.g. as an | 
| +// argument to kill or waitpid. | 
| +uint32_t MangleProcessId(ProcessId process_id) { | 
| + // Add a large power of 10 so that the pid is still the pid is still readable | 
| 
 
danakj
2015/09/23 21:56:31
"the pid is still the pid is still readable"
"the
 
rickyz (no longer on Chrome)
2015/09/24 01:22:03
Done
 
 | 
| + // for debugging | 
| + return static_cast<uint32_t>(process_id) + 1000000000U; | 
| +} | 
| + | 
| +} // namespace | 
| + | 
| +uint32_t GetUniqueIdForProcess() { | 
| + if (g_unique_id == kInvalidUniqueId) { | 
| + return MangleProcessId(GetCurrentProcId()); | 
| + } | 
| + | 
| + // Make sure we are the same process that set |g_procid|. This check may have | 
| + // false negatives (if a process ID was reused) but should have no false | 
| + // positives. | 
| + DCHECK_EQ(GetCurrentProcId(), g_procid); | 
| + return g_unique_id; | 
| +} | 
| + | 
| +#if defined(OS_LINUX) | 
| + | 
| +void InitUniqueIdForProcessInPidNamespace(ProcessId pid_outside_of_namespace) { | 
| + g_unique_id = MangleProcessId(pid_outside_of_namespace); | 
| + g_procid = GetCurrentProcId(); | 
| +} | 
| + | 
| +#endif | 
| + | 
| +} // namespace base |