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 |