tor-browser

The Tor Browser
git clone https://git.dasho.dev/tor-browser.git
Log | Files | Refs | README | LICENSE

ProfilerBufferSize.h (2555B)


      1 /* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
      2 /* vim: set ts=8 sts=2 et sw=2 tw=80: */
      3 /* This Source Code Form is subject to the terms of the Mozilla Public
      4 * License, v. 2.0. If a copy of the MPL was not distributed with this
      5 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
      6 
      7 #ifndef ProfilerBufferSize_h
      8 #define ProfilerBufferSize_h
      9 
     10 #include "mozilla/ProfileBufferChunkManager.h"
     11 
     12 // We need to decide how many chunks of what size we want to fit in the given
     13 // total maximum capacity for this process, in the (likely) context of
     14 // multiple processes doing the same choice and having an inter-process
     15 // mechanism to control the overall memory limit.
     16 
     17 // The buffer size is provided as a number of "entries", this is their size in
     18 // bytes.
     19 constexpr static uint32_t scBytesPerEntry = 8;
     20 
     21 // Minimum chunk size allowed, enough for at least one stack.
     22 constexpr static uint32_t scMinimumChunkSize =
     23    2 * mozilla::ProfileBufferChunkManager::scExpectedMaximumStackSize;
     24 
     25 // Ideally we want at least 2 unreleased chunks to work with (1 current and 1
     26 // next), and 2 released chunks (so that one can be recycled when old, leaving
     27 // one with some data).
     28 constexpr static uint32_t scMinimumNumberOfChunks = 4;
     29 
     30 // And we want to limit chunks to a maximum size, which is a compromise
     31 // between:
     32 // - A big size, which helps with reducing the rate of allocations and IPCs.
     33 // - A small size, which helps with equalizing the duration of recorded data
     34 //   (as the inter-process controller will discard the oldest chunks in all
     35 //   Firefox processes).
     36 constexpr static uint32_t scMaximumChunkSize = 1024 * 1024;
     37 
     38 // Limit to 128MiB as a lower buffer size usually isn't enough.
     39 constexpr static uint32_t scMinimumBufferSize = 128u * 1024u * 1024u;
     40 // Note: Keep in sync with GeckoThread.maybeStartGeckoProfiler:
     41 // https://searchfox.org/mozilla-central/source/mobile/android/geckoview/src/main/java/org/mozilla/gecko/GeckoThread.java
     42 constexpr static uint32_t scMinimumBufferEntries =
     43    scMinimumBufferSize / scBytesPerEntry;
     44 
     45 // Limit to 2GiB.
     46 constexpr static uint32_t scMaximumBufferSize = 2u * 1024u * 1024u * 1024u;
     47 constexpr static uint32_t scMaximumBufferEntries =
     48    scMaximumBufferSize / scBytesPerEntry;
     49 
     50 constexpr static uint32_t ClampToAllowedEntries(uint32_t aEntries) {
     51  if (aEntries <= scMinimumBufferEntries) {
     52    return scMinimumBufferEntries;
     53  }
     54  if (aEntries >= scMaximumBufferEntries) {
     55    return scMaximumBufferEntries;
     56  }
     57  return aEntries;
     58 }
     59 
     60 #endif  // ProfilerBufferSize_h