diff options
Diffstat (limited to 'mozglue/baseprofiler/public/ProfilerBufferSize.h')
-rw-r--r-- | mozglue/baseprofiler/public/ProfilerBufferSize.h | 60 |
1 files changed, 60 insertions, 0 deletions
diff --git a/mozglue/baseprofiler/public/ProfilerBufferSize.h b/mozglue/baseprofiler/public/ProfilerBufferSize.h new file mode 100644 index 0000000000..d77d869a68 --- /dev/null +++ b/mozglue/baseprofiler/public/ProfilerBufferSize.h @@ -0,0 +1,60 @@ +/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ +/* vim: set ts=8 sts=2 et sw=2 tw=80: */ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +#ifndef ProfilerBufferSize_h +#define ProfilerBufferSize_h + +#include "mozilla/ProfileBufferChunkManager.h" + +// We need to decide how many chunks of what size we want to fit in the given +// total maximum capacity for this process, in the (likely) context of +// multiple processes doing the same choice and having an inter-process +// mechanism to control the overall memory limit. + +// The buffer size is provided as a number of "entries", this is their size in +// bytes. +constexpr static uint32_t scBytesPerEntry = 8; + +// Minimum chunk size allowed, enough for at least one stack. +constexpr static uint32_t scMinimumChunkSize = + 2 * mozilla::ProfileBufferChunkManager::scExpectedMaximumStackSize; + +// Ideally we want at least 2 unreleased chunks to work with (1 current and 1 +// next), and 2 released chunks (so that one can be recycled when old, leaving +// one with some data). +constexpr static uint32_t scMinimumNumberOfChunks = 4; + +// And we want to limit chunks to a maximum size, which is a compromise +// between: +// - A big size, which helps with reducing the rate of allocations and IPCs. +// - A small size, which helps with equalizing the duration of recorded data +// (as the inter-process controller will discard the oldest chunks in all +// Firefox processes). +constexpr static uint32_t scMaximumChunkSize = 1024 * 1024; + +// Limit to 128MiB as a lower buffer size usually isn't enough. +constexpr static uint32_t scMinimumBufferSize = 128u * 1024u * 1024u; +// Note: Keep in sync with GeckoThread.maybeStartGeckoProfiler: +// https://searchfox.org/mozilla-central/source/mobile/android/geckoview/src/main/java/org/mozilla/gecko/GeckoThread.java +constexpr static uint32_t scMinimumBufferEntries = + scMinimumBufferSize / scBytesPerEntry; + +// Limit to 2GiB. +constexpr static uint32_t scMaximumBufferSize = 2u * 1024u * 1024u * 1024u; +constexpr static uint32_t scMaximumBufferEntries = + scMaximumBufferSize / scBytesPerEntry; + +constexpr static uint32_t ClampToAllowedEntries(uint32_t aEntries) { + if (aEntries <= scMinimumBufferEntries) { + return scMinimumBufferEntries; + } + if (aEntries >= scMaximumBufferEntries) { + return scMaximumBufferEntries; + } + return aEntries; +} + +#endif // ProfilerBufferSize_h |