blob: 58ceb08469cb85f6dc74f2cb2fe5babe59cab2a7 [file] [log] [blame]
// 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) || 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;
} // namespace base