Make page size configurable when connecting a producer

shared_memory_page_size_hint_bytes has been added to
TracingService::ConnectProducer so that to being able to configure the
shared memory page size from ProducerHost::initialize

Bug: chromium:925148
Change-Id: If7ad339f3a2e0cb029556995cf9b840d54e66912
diff --git a/src/tracing/core/tracing_service_impl_unittest.cc b/src/tracing/core/tracing_service_impl_unittest.cc
index 547c9f9..93348ff 100644
--- a/src/tracing/core/tracing_service_impl_unittest.cc
+++ b/src/tracing/core/tracing_service_impl_unittest.cc
@@ -58,6 +58,8 @@
 
 namespace {
 constexpr size_t kDefaultShmSizeKb = TracingServiceImpl::kDefaultShmSize / 1024;
+constexpr size_t kDefaultShmPageSizeKb =
+    TracingServiceImpl::kDefaultShmPageSize / 1024;
 constexpr size_t kMaxShmSizeKb = TracingServiceImpl::kMaxShmSize / 1024;
 
 ::testing::AssertionResult HasTriggerModeInternal(
@@ -1396,8 +1398,20 @@
 TEST_F(TracingServiceImplTest, ProducerShmAndPageSizeOverriddenByTraceConfig) {
   std::unique_ptr<MockConsumer> consumer = CreateMockConsumer();
   consumer->Connect(svc.get());
-  const size_t kConfigPageSizesKb[] = /****/ {16, 16, 4, 0, 16, 8, 3, 4096, 4};
-  const size_t kExpectedPageSizesKb[] = /**/ {16, 16, 4, 4, 16, 8, 4, 64, 4};
+  const size_t kMaxPageSizeKb = SharedMemoryABI::kMaxPageSize / 1024;
+  const size_t kConfigPageSizesKb[] = /**/ {16, 0, 3, 2, 16, 8, 0, 4096, 0};
+  const size_t kPageHintSizesKb[] = /****/ {0, 4, 0, 0, 8, 0, 4096, 0, 0};
+  const size_t kExpectedPageSizesKb[] = {
+      16,                     // Use config value.
+      4,                      // Config is 0, use hint.
+      kDefaultShmPageSizeKb,  // Config % 4 != 0, take default.
+      kDefaultShmPageSizeKb,  // Less than page size, take default.
+      16,                     // Ignore the hint.
+      8,                      // Use config value.
+      kMaxPageSizeKb,         // Hint too big, take max value.
+      kMaxPageSizeKb,         // Config too high, take max value.
+      4                       // Fallback to default.
+  };
 
   const size_t kConfigSizesKb[] = /**/ {0, 16, 0, 20, 32, 7, 0, 96, 4096000};
   const size_t kHintSizesKb[] = /****/ {0, 0, 16, 32, 16, 0, 7, 96, 4096000};
@@ -1418,7 +1432,8 @@
   for (size_t i = 0; i < kNumProducers; i++) {
     auto name = "mock_producer_" + std::to_string(i);
     producer[i] = CreateMockProducer();
-    producer[i]->Connect(svc.get(), name, geteuid(), kHintSizesKb[i] * 1024);
+    producer[i]->Connect(svc.get(), name, geteuid(), kHintSizesKb[i] * 1024,
+                         kPageHintSizesKb[i] * 1024);
     producer[i]->RegisterDataSource("data_source");
   }