Index: base/metrics/stats_table.cc |
diff --git a/base/metrics/stats_table.cc b/base/metrics/stats_table.cc |
index f09e736b92ab9fdbe1a7e22c2ef8c982f5725e8d..03158fdbd0a9199fc5d7f9586615df9fe992def0 100644 |
--- a/base/metrics/stats_table.cc |
+++ b/base/metrics/stats_table.cc |
@@ -14,12 +14,6 @@ |
#include "base/threading/platform_thread.h" |
#include "base/threading/thread_local_storage.h" |
-#if defined(OS_POSIX) |
-#include "base/posix/global_descriptors.h" |
-#include "errno.h" |
-#include "ipc/ipc_descriptors.h" |
-#endif |
- |
namespace base { |
// The StatsTable uses a shared memory segment that is laid out as follows |
@@ -105,7 +99,7 @@ class StatsTable::Internal { |
// Construct a new Internal based on expected size parameters, or |
// return NULL on failure. |
- static Internal* New(const std::string& name, |
+ static Internal* New(const StatsTable::TableIdentifier& table, |
int size, |
int max_threads, |
int max_counters); |
@@ -151,8 +145,9 @@ class StatsTable::Internal { |
} |
// Create or open the SharedMemory used by the stats table. |
- static SharedMemory* CreateSharedMemory(const std::string& name, |
- int size); |
+ static SharedMemory* CreateSharedMemory( |
+ const StatsTable::TableIdentifier& table, |
+ int size); |
// Initializes the table on first access. Sets header values |
// appropriately and zeroes all counters. |
@@ -174,11 +169,12 @@ class StatsTable::Internal { |
}; |
// static |
-StatsTable::Internal* StatsTable::Internal::New(const std::string& name, |
- int size, |
- int max_threads, |
- int max_counters) { |
- scoped_ptr<SharedMemory> shared_memory(CreateSharedMemory(name, size)); |
+StatsTable::Internal* StatsTable::Internal::New( |
+ const StatsTable::TableIdentifier& table, |
+ int size, |
+ int max_threads, |
+ int max_counters) { |
+ scoped_ptr<SharedMemory> shared_memory(CreateSharedMemory(table, size)); |
if (!shared_memory.get()) |
return NULL; |
if (!shared_memory->Map(size)) |
@@ -200,16 +196,14 @@ StatsTable::Internal* StatsTable::Internal::New(const std::string& name, |
} |
// static |
-SharedMemory* StatsTable::Internal::CreateSharedMemory(const std::string& name, |
- int size) { |
+SharedMemory* StatsTable::Internal::CreateSharedMemory( |
+ const StatsTable::TableIdentifier& table, |
+ int size) { |
#if defined(OS_POSIX) |
- GlobalDescriptors* global_descriptors = GlobalDescriptors::GetInstance(); |
- if (global_descriptors->MaybeGet(kStatsTableSharedMemFd) != -1) { |
- // Open the shared memory file descriptor passed by the browser process. |
- FileDescriptor file_descriptor( |
- global_descriptors->Get(kStatsTableSharedMemFd), false); |
- return new SharedMemory(file_descriptor, false); |
- } |
+ // Check for existing table. |
+ if (table.fd != -1) |
+ return new SharedMemory(table, false); |
+ |
// Otherwise we need to create it. |
scoped_ptr<SharedMemory> shared_memory(new SharedMemory()); |
if (!shared_memory->CreateAnonymous(size)) |
@@ -217,15 +211,22 @@ SharedMemory* StatsTable::Internal::CreateSharedMemory(const std::string& name, |
return shared_memory.release(); |
#elif defined(OS_WIN) |
scoped_ptr<SharedMemory> shared_memory(new SharedMemory()); |
- if (!shared_memory->CreateNamedDeprecated(name, true, size)) |
- return NULL; |
+ if (table.empty()) { |
+ // Create an anonymous table. |
+ if (!shared_memory->CreateAnonymous(size)) |
+ return NULL; |
+ } else { |
+ // Create a named table for sharing between processes. |
+ if (!shared_memory->CreateNamedDeprecated(table, true, size)) |
+ return NULL; |
+ } |
return shared_memory.release(); |
#endif |
} |
void StatsTable::Internal::InitializeTable(void* memory, int size, |
- int max_counters, |
- int max_threads) { |
+ int max_counters, |
+ int max_threads) { |
// Zero everything. |
memset(memory, 0, size); |
@@ -286,7 +287,8 @@ struct StatsTable::TLSData { |
// We keep a singleton table which can be easily accessed. |
StatsTable* global_table = NULL; |
-StatsTable::StatsTable(const std::string& name, int max_threads, |
+StatsTable::StatsTable(const TableIdentifier& table, |
+ int max_threads, |
int max_counters) |
: internal_(NULL), |
tls_index_(SlotReturnFunction) { |
@@ -298,7 +300,7 @@ StatsTable::StatsTable(const std::string& name, int max_threads, |
AlignedSize(max_threads * sizeof(int)) + |
AlignedSize((sizeof(int) * (max_counters * max_threads))); |
- internal_ = Internal::New(name, table_size, max_threads, max_counters); |
+ internal_ = Internal::New(table, table_size, max_threads, max_counters); |
if (!internal_) |
DPLOG(ERROR) << "StatsTable did not initialize"; |