Chromium Code Reviews| Index: base/metrics/stats_table.cc |
| diff --git a/base/metrics/stats_table.cc b/base/metrics/stats_table.cc |
| index 4a3d939cfe093c460025ff2ed26c699fbc8fdd7b..e0011a9f979051b64de17116714d54b42ae3dec9 100644 |
| --- a/base/metrics/stats_table.cc |
| +++ b/base/metrics/stats_table.cc |
| @@ -15,7 +15,9 @@ |
| #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 { |
| @@ -106,7 +108,7 @@ class StatsTable::Private { |
| static Private* New(const std::string& name, int size, |
| int max_threads, int max_counters); |
|
jar (doing other things)
2013/08/22 00:29:38
nit: fix indentation. Chromium standard for decla
rmcilroy
2013/08/22 10:03:55
Done.
|
| - SharedMemory* shared_memory() { return &shared_memory_; } |
| + SharedMemory* shared_memory() { return shared_memory_.get(); } |
| // Accessors for our header pointers |
| TableHeader* table_header() const { return table_header_; } |
| @@ -136,8 +138,9 @@ class StatsTable::Private { |
| private: |
| // Constructor is private because you should use New() instead. |
| - Private() |
| - : table_header_(NULL), |
| + explicit Private(SharedMemory* shared_memory) |
| + : shared_memory_(shared_memory), |
| + table_header_(NULL), |
| thread_names_table_(NULL), |
| thread_tid_table_(NULL), |
| thread_pid_table_(NULL), |
| @@ -145,6 +148,9 @@ class StatsTable::Private { |
| data_table_(NULL) { |
| } |
| + // Create or open the SharedMemory used by the stats table. |
| + static SharedMemory* CreateSharedMemory(int size); |
| + |
| // Initializes the table on first access. Sets header values |
| // appropriately and zeroes all counters. |
| void InitializeTable(void* memory, int size, int max_counters, |
| @@ -153,7 +159,7 @@ class StatsTable::Private { |
| // Initializes our in-memory pointers into a pre-created StatsTable. |
| void ComputeMappedPointers(void* memory); |
| - SharedMemory shared_memory_; |
| + scoped_ptr<SharedMemory> shared_memory_; |
| TableHeader* table_header_; |
| char* thread_names_table_; |
| PlatformThreadId* thread_tid_table_; |
| @@ -167,13 +173,14 @@ StatsTable::Private* StatsTable::Private::New(const std::string& name, |
| int size, |
| int max_threads, |
| int max_counters) { |
| - scoped_ptr<Private> priv(new Private()); |
| - if (!priv->shared_memory_.CreateNamed(name, true, size)) |
| + scoped_ptr<SharedMemory> shared_memory(CreateSharedMemory(size)); |
| + if (!shared_memory.get()) |
| return NULL; |
| - if (!priv->shared_memory_.Map(size)) |
| + if (!shared_memory->Map(size)) |
| return NULL; |
| - void* memory = priv->shared_memory_.memory(); |
| + void* memory = shared_memory->memory(); |
| + scoped_ptr<Private> priv(new Private(shared_memory.release())); |
|
jar (doing other things)
2013/08/22 00:29:38
nit: Style: Don't abbreviate in names. Sadly, the
rmcilroy
2013/08/22 10:03:55
Done (went with Internal)
|
| TableHeader* header = static_cast<TableHeader*>(memory); |
| // If the version does not match, then assume the table needs |
| @@ -187,6 +194,29 @@ StatsTable::Private* StatsTable::Private::New(const std::string& name, |
| return priv.release(); |
| } |
| +// static |
| +SharedMemory* StatsTable::Private::CreateSharedMemory(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); |
| + } |
| + // Otherwise we need to create it. |
| + scoped_ptr<SharedMemory> shared_memory(new SharedMemory()); |
| + if (!shared_memory->CreateAnonymous(size)) |
| + return NULL; |
| + return shared_memory.release(); |
| +#elif defined(OS_WIN) |
| + scoped_ptr<SharedMemory> shared_memory(new SharedMemory()); |
| + if (!shared_memory.CreateNamed(name, true, size)) |
| + return NULL; |
| + return shared_memory.release(); |
| +#endif |
| +} |
| + |
| void StatsTable::Private::InitializeTable(void* memory, int size, |
| int max_counters, |
| int max_threads) { |
| @@ -565,4 +595,10 @@ StatsTable::TLSData* StatsTable::GetTLSData() const { |
| return data; |
| } |
| +#if defined(OS_POSIX) |
| +SharedMemoryHandle StatsTable::GetSharedMemoryHandle() const { |
| + return impl_ ? impl_->shared_memory()->handle() : SharedMemory::NULLHandle(); |
| +} |
| +#endif |
| + |
| } // namespace base |