Index: content/app/content_main_runner.cc |
diff --git a/content/app/content_main_runner.cc b/content/app/content_main_runner.cc |
index a00066f98eb9f38334445579538d7dce1a7257d7..4ca6f30b509295bb406d9e42484d69332623e279 100644 |
--- a/content/app/content_main_runner.cc |
+++ b/content/app/content_main_runner.cc |
@@ -45,6 +45,7 @@ |
#include "content/renderer/in_process_renderer_thread.h" |
#include "content/utility/in_process_utility_thread.h" |
#include "crypto/nss_util.h" |
+#include "ipc/ipc_descriptors.h" |
#include "ipc/ipc_switches.h" |
#include "media/base/media.h" |
#include "sandbox/win/src/sandbox_types.h" |
@@ -239,11 +240,11 @@ void CommonSubprocessInit(const std::string& process_type) { |
#endif |
} |
+// Only needed on Windows for creating stats tables. |
+#if defined(OS_WIN) |
static base::ProcessId GetBrowserPid(const CommandLine& command_line) { |
base::ProcessId browser_pid = base::GetCurrentProcId(); |
-#if !defined(OS_IOS) |
if (command_line.HasSwitch(switches::kProcessChannelID)) { |
-#if defined(OS_WIN) || defined(OS_MACOSX) |
std::string channel_name = |
command_line.GetSwitchValueASCII(switches::kProcessChannelID); |
@@ -251,27 +252,10 @@ static base::ProcessId GetBrowserPid(const CommandLine& command_line) { |
base::StringToInt(channel_name, &browser_pid_int); |
browser_pid = static_cast<base::ProcessId>(browser_pid_int); |
DCHECK_NE(browser_pid_int, 0); |
-#elif defined(OS_ANDROID) |
- // On Android, the browser process isn't the parent. A bunch |
- // of work will be required before callers of this routine will |
- // get what they want. |
- // |
- // Note: On Linux, base::GetParentProcessId() is defined in |
- // process_util_linux.cc. Note that *_linux.cc is excluded from |
- // Android builds but a special exception is made in base.gypi |
- // for a few files including process_util_linux.cc. |
- LOG(ERROR) << "GetBrowserPid() not implemented for Android()."; |
-#elif defined(OS_POSIX) |
- // On linux, we're in a process forked from the zygote here; so we need the |
- // parent's parent process' id. |
- browser_pid = |
- base::GetParentProcessId( |
- base::GetParentProcessId(base::GetCurrentProcId())); |
-#endif |
} |
-#endif // !OS_IOS |
return browser_pid; |
} |
+#endif |
static void InitializeStatsTable(const CommandLine& command_line) { |
// Initialize the Stats Counters table. With this initialized, |
@@ -282,11 +266,25 @@ static void InitializeStatsTable(const CommandLine& command_line) { |
if (command_line.HasSwitch(switches::kEnableStatsTable)) { |
// NOTIMPLEMENTED: we probably need to shut this down correctly to avoid |
// leaking shared memory regions on posix platforms. |
- std::string statsfile = |
+#if defined(OS_POSIX) |
+ // Stats table is in the global file descriptors table on Posix. |
+ base::GlobalDescriptors* global_descriptors = |
+ base::GlobalDescriptors::GetInstance(); |
+ base::FileDescriptor table_ident; |
+ if (global_descriptors->MaybeGet(kStatsTableSharedMemFd) != -1) { |
+ // Open the shared memory file descriptor passed by the browser process. |
+ table_ident = base::FileDescriptor( |
+ global_descriptors->Get(kStatsTableSharedMemFd), false); |
+ } |
+#elif defined(OS_WIN) |
+ // Stats table is in a named segment on Windows. Use the PID to make this |
+ // unique on the system. |
+ std::string table_ident = |
base::StringPrintf("%s-%u", kStatsFilename, |
static_cast<unsigned int>(GetBrowserPid(command_line))); |
- base::StatsTable* stats_table = new base::StatsTable(statsfile, |
- kStatsMaxThreads, kStatsMaxCounters); |
+#endif |
+ base::StatsTable* stats_table = |
+ new base::StatsTable(table_ident, kStatsMaxThreads, kStatsMaxCounters); |
base::StatsTable::set_current(stats_table); |
} |
} |