| // 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_config.h" |
| |
| namespace base { |
| |
| namespace { |
| bool g_have_unique_id = false; |
| uint32_t g_unique_id; |
| |
| // 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 |
| // inside the mangled id. |
| return static_cast<uint32_t>(process_id) + 1000000000U; |
| } |
| |
| } // namespace |
| |
| uint32_t GetUniqueIdForProcess() { |
| if (!g_have_unique_id) { |
| 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) || defined(OS_AIX) |
| |
| void InitUniqueIdForProcessInPidNamespace(ProcessId pid_outside_of_namespace) { |
| g_unique_id = MangleProcessId(pid_outside_of_namespace); |
| g_procid = GetCurrentProcId(); |
| g_have_unique_id = true; |
| } |
| |
| #endif |
| |
| } // namespace base |