Index: base/metrics/stats_table.cc |
diff --git a/base/metrics/stats_table.cc b/base/metrics/stats_table.cc |
index 4a3d939cfe093c460025ff2ed26c699fbc8fdd7b..f8251fa8b5c0ce8f2faa65097addcbad219bb7dc 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); |
- 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), |
+ Private(SharedMemory* shared_memory) |
jar (doing other things)
2013/08/21 01:09:46
nit: explicit
rmcilroy
2013/08/21 10:37:16
Done.
|
+ : 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,12 +173,11 @@ 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)) |
- return NULL; |
- if (!priv->shared_memory_.Map(size)) |
+ scoped_ptr<Private> priv(new Private(CreateSharedMemory(size))); |
+ |
+ if (!priv->shared_memory_->Map(size)) |
jar (doing other things)
2013/08/21 01:09:46
Your code can return a null in several cases (line
rmcilroy
2013/08/21 10:37:16
Good point, done.
|
return NULL; |
- void* memory = priv->shared_memory_.memory(); |
+ void* memory = priv->shared_memory_->memory(); |
TableHeader* header = static_cast<TableHeader*>(memory); |
@@ -187,6 +192,30 @@ 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) { |
+ // If no global table exists, create it. |
+ scoped_ptr<SharedMemory> shared_memory(new SharedMemory()); |
+ if (!shared_memory->CreateAnonymous(size)) |
+ return NULL; |
+ return shared_memory.release(); |
+ } else { |
jar (doing other things)
2013/08/21 01:09:46
nit: no need for "else" and indent, since you retu
rmcilroy
2013/08/21 10:37:16
Done.
|
+ // Otherwise open the file descriptor passed by the browser process. |
+ FileDescriptor file_descriptor( |
+ global_descriptors->Get(kStatsTableSharedMemFd), false); |
+ return new SharedMemory(file_descriptor, false); |
+ } |
+#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 +594,10 @@ StatsTable::TLSData* StatsTable::GetTLSData() const { |
return data; |
} |
+#if defined(OS_POSIX) |
+base::SharedMemoryHandle StatsTable::GetSharedMemoryHandle() const { |
+ return impl_->shared_memory()->handle(); |
jar (doing other things)
2013/08/21 01:09:46
Shouldn't you handle impl_ == NULL?
rmcilroy
2013/08/21 10:37:16
Done.
|
+} |
+#endif |
+ |
} // namespace base |