// 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 { 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) 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