<!--
Copyright 2020 The Chromium Authors
Use of this source code is governed by a BSD-style license that can be
found in the LICENSE file.
-->

<!--
This file is used to generate a comprehensive list of others histograms
along with a detailed description for each histogram.

For best practices on writing histogram descriptions, see
https://chromium.googlesource.com/chromium/src.git/+/HEAD/tools/metrics/histograms/README.md

Please follow the instructions in the OWNERS file in this directory to find a
reviewer. If no OWNERS file exists, please consider signing up at
go/reviewing-metrics (Googlers only), as all subdirectories are expected to
have an OWNERS file. As a last resort you can send the CL to
chromium-metrics-reviews@google.com.
-->

<histogram-configuration>

<histograms>

<variants name="Length">
  <variant name="Any" summary="of arbitrary length"/>
  <variant name="Medium" summary="lasting between 1 and 100ms"/>
</variants>

<variants name="NamedThread">
  <variant name="BrowserIO" summary="the browser IO thread"/>
  <variant name="BrowserUI" summary="the browser UI thread"/>
  <variant name="Other"/>
</variants>

<histogram name="MessagePumpEpoll.WatchedFileDescriptors"
    units="FileDescriptors" expires_after="2026-12-27">
  <owner>mthiesse@chromium.org</owner>
  <owner>lizeb@chromium.org</owner>
  <summary>
    The number of file descriptors in the watch list for the epoll message pump.
    Sampled periodically every minute for each thread with an epoll message
    pump.
  </summary>
</histogram>

<histogram
    name="Scheduling.ContendedLockAcquisitionTime.{LockType}.{ProcessName}.{ThreadGroup}Worker"
    units="microseconds" expires_after="2027-02-07">
  <owner>fionav@google.com</owner>
  <owner>clank-performance-team@google.com</owner>
  <summary>
    The time it takes to acquire a contended {LockType} on the {ThreadGroup}
    thread pool in the {ProcessName} process. This is recorded with probability
    1/1000 when acquisition of the lock is likely to cause the thread to wait in
    the kernel.

    Note: The metric is reported for only clients with high-resolution clocks (a
    subset of Windows clients won't report it, see the
    Windows.HasHighResolutionTimeTicks histogram).
  </summary>
  <token key="LockType">
    <variant name="BaseLock" summary="base:Lock"/>
    <variant name="PartitionAllocLock"
        summary="partition_alloc::internal::Lock"/>
  </token>
  <token key="ThreadGroup">
    <variant name="Background"
        summary="a thread pool background worker thread"/>
    <variant name="Foreground"
        summary="a thread pool foreground worker thread"/>
  </token>
  <token key="ProcessName">
    <variant name="Browser" summary="the browser process"/>
    <variant name="GPU" summary="the gpu process"/>
    <variant name="Renderer" summary="the renderer process"/>
  </token>
</histogram>

<histogram
    name="Scheduling.ContendedLockAcquisitionTime.{LockType}.{ThreadName}"
    units="microseconds" expires_after="2027-01-10">
  <owner>anandrv@google.com</owner>
  <owner>clank-performance-team@google.com</owner>
  <summary>
    The time it takes to acquire a contended {LockType} on {ThreadName}. This is
    recorded with probability 1/1000 when acquisitiion of the lock is likely to
    cause the thread to wait in the kernel.

    Note: The metric is reported for only clients with high-resolution clocks (a
    subset of Windows clients won't report it, see the
    Windows.HasHighResolutionTimeTicks histogram).
  </summary>
  <token key="LockType">
    <variant name="BaseLock" summary="base:Lock"/>
    <variant name="PartitionAllocLock"
        summary="partition_alloc::internal::Lock"/>
  </token>
  <token key="ThreadName">
    <variant name="BrowserIO" summary="the browser IO thread"/>
    <variant name="Compositor" summary="the compositor thread"/>
    <variant name="CrBrowserMain" summary="the browser main thread"/>
    <variant name="CrGpuMain" summary="the gpu main thread"/>
    <variant name="CrRendererMain" summary="the renderer main thread"/>
    <variant name="NetworkService" summary="the network service thread"/>
    <variant name="VizCompositor" summary="the viz compositor thread"/>
  </token>
</histogram>

<histogram name="Scheduling.DBusSchedQoS.PidReusedOnSetProcessState"
    enum="PidReuseResult" expires_after="2025-10-26">
  <owner>kawasin@google.com</owner>
  <owner>joelaf@google.com</owner>
  <summary>
    Records whether or not a pid is reused between the time a SetProcessState
    DBus request is dispatched and when the request's result is processed. Pid
    reuse can race with the DBus request to result in the requested scheduler
    settings being applied to the wrong process, although this metric cannot
    differentiate between winning and losing that race. This is emitted every
    time a new Chrome process is created or changes background state.
  </summary>
</histogram>

<histogram name="Scheduling.DBusSchedQoS.PidReusedOnSetThreadState"
    enum="PidReuseResult" expires_after="2025-10-26">
  <owner>kawasin@google.com</owner>
  <owner>joelaf@google.com</owner>
  <summary>
    Records whether or not a pid is reused between the time a SetThreadState
    DBus request is dispatched and when the request's result is processed. Pid
    reuse can race with the DBus request to result in the requested scheduler
    settings being applied to the wrong thread, although this metric cannot
    differentiate between winning and losing that race. This is emitted every
    time Chrome creates a thread or changes a thread type.
  </summary>
</histogram>

<histogram name="Scheduling.DBusSchedQoS.ServiceConnectionSuccess"
    enum="Boolean" expires_after="2025-11-02">
  <owner>kawasin@google.com</owner>
  <owner>joelaf@google.com</owner>
  <summary>
    Records whether ResourcedClient::WaitForServiceToBeAvailable() succeeds or
    not. It fails only when ObjectProxy::ConnectToNameOwnerChangedSignal() fails
    which we expect to fail very rarely. This is emitted every time the callback
    of ResourcedClient::WaitForServiceToBeAvailable() runs.
  </summary>
</histogram>

<histogram name="Scheduling.DBusSchedQoS.SetProcessStateLatency"
    units="microseconds" expires_after="2025-10-26">
  <owner>kawasin@google.com</owner>
  <owner>joelaf@google.com</owner>
  <summary>
    Records amount of time it takes to execute SetProcessState DBus request on
    ChromeOS. This is emitted every time a new Chrome process is created or
    changes background state. All ChromeOS clients have high-resolution timers.
  </summary>
</histogram>

<histogram name="Scheduling.DBusSchedQoS.SetThreadStateLatency"
    units="microseconds" expires_after="2025-10-26">
  <owner>kawasin@google.com</owner>
  <owner>joelaf@google.com</owner>
  <summary>
    Records amount of time it takes to execute SetThreadState DBus request on
    ChromeOS. This is emitted every time Chrome creates a thread or changes a
    thread type. All ChromeOS clients have high-resolution timers.
  </summary>
</histogram>

<histogram name="Scheduling.DelayedTask.LongDelayedTaskPostedLocation"
    units="hash" expires_after="2027-06-05">
  <owner>peilinwang@google.com</owner>
  <owner>clank-performance-team@google.com</owner>
  <summary>
    Records the hash of callers (file_name:function_name) that post delayed
    tasks with a delay longer than 25 minutes. Recorded in
    TaskQueueImpl::MakeDelayedTask when the DelayedTask is created.

    Subsampled with probability 1/1000.
  </summary>
</histogram>

<histogram name="Scheduling.MessagePump.WakeupCount2.{ThreadName}"
    enum="BooleanHit" expires_after="2027-02-07">
  <owner>pasko@chromium.org</owner>
  <owner>joenotcharles@google.com</owner>
  <summary>
    Records true every time the underlying OS event successfully wakes up thread
    {ThreadName} from idle sleep.

    Avoids recording spurious OS wakeups: when no events are processed. This can
    happen because of timeouts when waiting.

    Also excludes samples for 'synthetic wakeups', such as when an event is
    discovered by BusyWaitOnEvent. In Finch experiments, enabling busy waiting
    should directly reduce the volume of recorded wakeups.
  </summary>
  <token key="ThreadName">
    <variant name="BrowserIO"/>
    <variant name="BrowserMain"/>
    <variant name="Compositor"/>
    <variant name="GpuMain"/>
    <variant name="NetworkService"/>
    <variant name="RendererMain"/>
    <variant name="VizCompositor"/>
  </token>
</histogram>

<histogram name="Scheduling.MessagePumpDefault.BusyLoop.Duration.TaskArrived"
    units="microseconds" expires_after="2027-04-10">
  <owner>anandrv@google.com</owner>
  <owner>clank-performance-team@google.com</owner>
  <summary>
    The wall time duration of busy-loops on the default message pump that
    successfully avoided sleeping because a task arrived.

    Recorded only on clients with high-resolution clocks.

    Subsampled with probability 1/1000.
  </summary>
</histogram>

<histogram name="Scheduling.MessagePumpDefault.BusyLoop.Duration.TimedOut"
    units="microseconds" expires_after="2027-04-10">
  <owner>anandrv@google.com</owner>
  <owner>clank-performance-team@google.com</owner>
  <summary>
    The wall time duration of busy-loops on the default message pump that timed
    out without any task arriving.

    Recorded only on clients with high-resolution clocks.

    Subsampled with probability 1/1000.
  </summary>
</histogram>

<histogram name="Scheduling.MessagePumpDefault.BusyLoop.PredictionAccuracy"
    enum="BusyLoopPredictionAccuracy" expires_after="2027-04-24">
  <owner>anandrv@google.com</owner>
  <owner>clank-performance-team@google.com</owner>
  <summary>
    Records the accuracy of the busy-loop heuristic on the default message pump.

    * True Positive: Heuristic predicted to busy loop and a task arrived within
    the max busy loop duration.

    * False Positive: Heuristic predicted to busy loop but no task arrived
    within the max busy loop duration.

    * True Negative: Heuristic predicted not to busy loop and no task arrived
    within the max busy loop duration.

    * False Negative: Heuristic predicted not to busy loop but a task arrived
    within the max busy loop duration.

    Subsampled with probability 1/1000.
  </summary>
</histogram>

<histogram name="Scheduling.MessagePumpDefault.BusyLoop.TargetDuration"
    units="microseconds" expires_after="2027-04-10">
  <owner>anandrv@google.com</owner>
  <owner>clank-performance-team@google.com</owner>
  <summary>
    The maximum busy-loop target duration that was configured on the default
    message pump.

    Recorded only on clients with high-resolution clocks.

    Subsampled with probability 1/1000.
  </summary>
</histogram>

<histogram name="Scheduling.MessagePumpDefault.BusyLoop.TaskArrived"
    enum="Boolean" expires_after="2027-04-10">
  <owner>anandrv@google.com</owner>
  <owner>clank-performance-team@google.com</owner>
  <summary>
    Records whether busy-looping on the default message pump succeeded or not.

    Subsampled with probability 1/1000.
  </summary>
</histogram>

<histogram name="Scheduling.MessagePumpTimeKeeper.{NamedThread}"
    enum="MessagePumpPhases" expires_after="2026-12-20">
  <owner>gab@chromium.org</owner>
  <owner>fdoray@chromium.org</owner>
  <owner>spvm@chromium.org</owner>
  <summary>
    Records the number of milliseconds spent in each phase of pumping tasks on
    {NamedThread}. Each enum value can be analyzed for its total time or as a
    percentage relative to other phases.
  </summary>
  <token key="NamedThread" variants="NamedThread"/>
</histogram>

<histogram name="Scheduling.Renderer.DrawInterval2" units="microseconds"
    expires_after="never">
<!-- expires-never: guiding metric (internal: go/chrome-browser-guiding-metrics) -->

  <owner>vmiura@chromium.org</owner>
  <owner>speed-metrics-dev@chromium.org</owner>
  <owner>chrome-analysis-team@google.com</owner>
  <improvement direction="LOWER_IS_BETTER"/>
  <summary>
    The time delta between the draw times of back-to-back BeginImplFrames,
    regardless of whether or not they result in a swap.

    The interval is only recorded when every BeginImplFrame wants to draw.

    Do not modify this metric in any way without contacting
    speed-metrics-dev@chromium.org AND chrome-analysis-team@google.com.

    Warning: This metric may include reports from clients with low-resolution
    clocks (i.e. on Windows, ref. |TimeTicks::IsHighResolution()|). Such reports
    will cause this metric to have an abnormal distribution. When considering
    revising this histogram, see UMA_HISTOGRAM_CUSTOM_HIGH_RESOLUTION_TIMES for
    the solution.
  </summary>
</histogram>

<histogram name="Scheduling.SchedQoS.SetProcessStateError" enum="QoSErrorType"
    expires_after="2026-01-11">
  <owner>kawasin@google.com</owner>
  <owner>joelaf@google.com</owner>
  <summary>
    The error types from schedqos feature in resourced. This is recorded each
    time the SetProcessState DBus request fails. The request rarely fails.
  </summary>
</histogram>

<histogram name="Scheduling.SchedQoS.SetThreadStateError" enum="QoSErrorType"
    expires_after="2026-01-11">
  <owner>kawasin@google.com</owner>
  <owner>joelaf@google.com</owner>
  <summary>
    The error types from schedqos feature in resourced. This is recorded each
    time the SetThreadState DBus request fails. The request rarely fails.
  </summary>
</histogram>

<histogram
    name="Scheduling.ThreadController.ActiveIntervalDuration.Short.{NamedThread}"
    units="microseconds" expires_after="2025-01-26">
  <owner>olivierli@google.com</owner>
  <owner>etienneb@google.com</owner>
  <summary>
    Records the duration of an active period of less than 1 millisecond using
    ThreadController on {NamedThread}. Recorded when an active period ends.
    Sub-sampled to 0.1% of intervals.

    WARNING: This metric is not recorded on clients with low-resolution clocks,
    which means measurments are biased against a portion of the population on
    Windows. See Windows.HasHighResolutionTimeTicks for additional details.
  </summary>
  <token key="NamedThread" variants="NamedThread"/>
</histogram>

<histogram
    name="Scheduling.ThreadController.ActiveIntervalDuration.{Length}.{NamedThread}"
    units="ms" expires_after="2027-02-07">
  <owner>olivierli@google.com</owner>
  <owner>etienneb@google.com</owner>
  <summary>
    Records the duration of an active period {Length} using ThreadController
    {NamedThread}. Recorded when an active period ends. Sub-sampled to 0.1% of
    intervals.
  </summary>
  <token key="Length" variants="Length"/>
  <token key="NamedThread" variants="NamedThread"/>
</histogram>

<histogram
    name="Scheduling.ThreadController.ActiveIntervalOffCpuDuration.Short.{NamedThread}"
    units="microseconds" expires_after="2025-01-26">
  <owner>olivierli@google.com</owner>
  <owner>etienneb@google.com</owner>
  <summary>
    Records the duration spent off-cpu during an active period of less than 1
    millisecond using ThreadController on {NamedThread}. Recorded when an active
    period ends. Sub-sampled to 0.1% of intervals.

    WARNING: This metric is not recorded on clients with low-resolution clocks,
    which means measurments are biased against a portion of the population on
    Windows. See Windows.HasHighResolutionTimeTicks for additional details.
  </summary>
  <token key="NamedThread" variants="NamedThread"/>
</histogram>

<histogram
    name="Scheduling.ThreadController.ActiveIntervalOffCpuDuration.{Length}.{NamedThread}"
    units="ms" expires_after="2027-02-07">
  <owner>olivierli@google.com</owner>
  <owner>etienneb@google.com</owner>
  <summary>
    Records the duration spent off-cpu during an active period {Length} operiod
    using ThreadController on {NamedThread}. Recorded when an active period
    ends. Sub-sampled to 0.1% of intervals.
  </summary>
  <token key="Length" variants="Length"/>
  <token key="NamedThread" variants="NamedThread"/>
</histogram>

<histogram
    name="Scheduling.ThreadController.ActiveIntervalOnCpuDuration.Short.{NamedThread}"
    units="microseconds" expires_after="2025-03-30">
  <owner>olivierli@google.com</owner>
  <owner>etienneb@google.com</owner>
  <summary>
    Records the duration spent on-cpu during an active period of less than 1
    millisecond using ThreadController on {NamedThread}. Recorded when an active
    period ends. Sub-sampled to 0.1% of intervals.

    WARNING: This metric is not recorded on clients with low-resolution clocks,
    which means measurments are biased against a portion of the population on
    Windows. See Windows.HasHighResolutionTimeTicks for additional details.
  </summary>
  <token key="NamedThread" variants="NamedThread"/>
</histogram>

<histogram
    name="Scheduling.ThreadController.ActiveIntervalOnCpuDuration.{Length}.{NamedThread}"
    units="ms" expires_after="2027-02-07">
  <owner>olivierli@google.com</owner>
  <owner>etienneb@google.com</owner>
  <summary>
    Records the duration spent on-cpu during an active period {Length} using
    ThreadController on {NamedThread}. Recorded when an active period ends.
    Sub-sampled to 0.1% of intervals.
  </summary>
  <token key="Length" variants="Length"/>
  <token key="NamedThread" variants="NamedThread"/>
</histogram>

<histogram
    name="Scheduling.ThreadController.ActiveIntervalOnCpuPercentage.Short.{NamedThread}"
    units="%" expires_after="2027-02-07">
  <owner>olivierli@google.com</owner>
  <owner>etienneb@google.com</owner>
  <summary>
    Records the percentage of time a thread stayed on-cpu during an active
    ThreadController period of less than 1 millisecond on {NamedThread}.
    Recorded when an active period ends. Sub-sampled to 0.1% of intervals.
  </summary>
  <token key="NamedThread" variants="NamedThread"/>
</histogram>

<histogram
    name="Scheduling.ThreadController.ActiveIntervalOnCpuPercentage.{Length}.{NamedThread}"
    units="%" expires_after="2027-02-07">
  <owner>olivierli@google.com</owner>
  <owner>etienneb@google.com</owner>
  <summary>
    Records the percentage of time a thread stayed on-cpu during an active
    ThreadController period {Length} on {NamedThread}. Recorded when an active
    period ends. Sub-sampled to 0.1% of intervals.
  </summary>
  <token key="Length" variants="Length"/>
  <token key="NamedThread" variants="NamedThread"/>
</histogram>

<histogram
    name="Scheduling.ThreadController.ActiveOffCpuVsWallTimePercentage.CrGpuMain"
    units="%" expires_after="never">
<!-- expires-never: used by downstream media quality regression automation -->

  <owner>henrika@google.com</owner>
  <owner>handellm@google.com</owner>
  <summary>
    Records the percentage of time the main GPU thread stayed off-cpu during
    active periods relative to the total time since the last metric was stored.
    Recorded over a window of length one second and each sample is independent
    of the previous one, hence knowing the value of x[i] does not provide any
    information about x[i+1].

    Example: if the main GPU thread has been in an active state for 200 ms
    during the last second and 50 ms was off-cpu, as sample of 5% is stored. In
    this example, the corresponding on-cpu sample would be 15%.

    NOTE: This metric is only recorded when the command-line flag
    enable-gpu-main-time-keeper-metrics is enabled.
  </summary>
</histogram>

<histogram
    name="Scheduling.ThreadController.ActiveOnCpuVsWallTimePercentage.CrGpuMain"
    units="%" expires_after="never">
<!-- expires-never: used by downstream media quality regression automation -->

  <owner>henrika@google.com</owner>
  <owner>handellm@google.com</owner>
  <summary>
    Records the percentage of time the main GPU thread stayed on-cpu during
    active periods relative to the total time since the last metric was stored.
    Recorded over a window of length one second and each sample is independent
    of the previous one, hence knowing the value of x[i] does not provide any
    information about x[i+1].

    Example: if the main GPU thread has been in an active state for 200 ms
    during the last second and 150 ms was on-cpu, as sample of 15% is stored. In
    this example, the corresponding off-cpu sample would be 5%.

    NOTE: This metric is only recorded when the command-line flag
    enable-gpu-main-time-keeper-metrics is enabled.
  </summary>
</histogram>

<histogram
    name="Scheduling.ThreadController.ActiveVsWallTimePercentage.CrGpuMain"
    units="%" expires_after="never">
<!-- expires-never: used by downstream media quality regression automation -->

  <owner>henrika@google.com</owner>
  <owner>handellm@google.com</owner>
  <summary>
    Records the percentage of time the main GPU thread is active relative to the
    total time since the last metric was stored. Recorded over a window of
    length one second and each sample is independent of the previous one, hence
    knowing the value of x[i] does not provide any information about x[i+1].

    Example: if the main GPU thread has been in an active state for 200 ms
    during the last second, a sample of 20% will be stored.

    NOTE: This metric is only recorded when the command-line flag
    enable-gpu-main-time-keeper-metrics is enabled.
  </summary>
</histogram>

<histogram name="Scheduling.ThreadController.IdleDuration.Short.{NamedThread}"
    units="microseconds" expires_after="2025-01-26">
  <owner>olivierli@google.com</owner>
  <owner>etienneb@google.com</owner>
  <summary>
    Records the duration of an idle period of less than 1 millisecond using
    ThreadController on {NamedThread}. Recorded when an active period begins.
    Sub-sampled to 0.1% of intervals.

    WARNING: This metric is not recorded on clients with low-resolution clocks,
    which means measurments are biased against a portion of the population on
    Windows. See Windows.HasHighResolutionTimeTicks for additional details.
  </summary>
  <token key="NamedThread" variants="NamedThread"/>
</histogram>

<histogram
    name="Scheduling.ThreadController.IdleDuration.{Length}.{NamedThread}"
    units="ms" expires_after="2027-02-07">
  <owner>olivierli@google.com</owner>
  <owner>etienneb@google.com</owner>
  <summary>
    Records the duration of an idle period {Length} using ThreadController on
    {NamedThread}. Recorded when an active period begins. Sub-sampled to 0.1% of
    intervals.
  </summary>
  <token key="Length" variants="Length"/>
  <token key="NamedThread" variants="NamedThread"/>
</histogram>

<histogram name="Scheduling.ThreadPriority.Browser.{ThreadName}" units="int"
    expires_after="2027-01-03">
  <owner>anandrv@google.com</owner>
  <owner>clank-performance-team@google.com</owner>
  <summary>
    The nice value of {ThreadName} in the browser process.

    Recorded only on Android. Sampled once every five minutes.
  </summary>
  <token key="ThreadName">
    <variant name="IOThread" summary="the IO thread"/>
    <variant name="NetworkService" summary="the network thread"/>
    <variant name="ThreadPoolBackgroundWorker"
        summary="a thread pool background worker thread"/>
    <variant name="ThreadPoolForegroundWorker"
        summary="a thread pool foreground worker thread"/>
    <variant name="UIThread" summary="the main thread"/>
  </token>
</histogram>

<histogram name="Scheduling.ThreadPriority.GPUProcess.{ThreadName}" units="int"
    expires_after="2027-01-03">
  <owner>anandrv@google.com</owner>
  <owner>clank-performance-team@google.com</owner>
  <summary>
    The nice value of {ThreadName} in the GPU process.

    Recorded only on Android. Sampled once every five minutes.
  </summary>
  <token key="ThreadName">
    <variant name="GpuMain" summary="the main thread"/>
    <variant name="IOThread" summary="the IO thread"/>
    <variant name="ThreadPoolBackgroundWorker"
        summary="a thread pool background worker thread"/>
    <variant name="ThreadPoolForegroundWorker"
        summary="a thread pool foreground worker thread"/>
    <variant name="VizCompositor" summary="the viz compositor thread"/>
  </token>
</histogram>

<histogram name="Scheduling.ThreadPriority.Renderer.{ThreadName}" units="int"
    expires_after="2027-01-03">
  <owner>anandrv@google.com</owner>
  <owner>clank-performance-team@google.com</owner>
  <summary>
    The nice value of {ThreadName} in a renderer process.

    Recorded only on Android. Sampled once every five minutes.
  </summary>
  <token key="ThreadName">
    <variant name="Compositor" summary="the compositor thread"/>
    <variant name="IOThread" summary="the IO thread"/>
    <variant name="RendererMain" summary="the main thread"/>
    <variant name="ThreadPoolBackgroundWorker"
        summary="a thread pool background worker thread"/>
    <variant name="ThreadPoolForegroundWorker"
        summary="a thread pool foreground worker thread"/>
  </token>
</histogram>

<histogram name="ThreadPool.UnnecessaryWakeup.{ThreadPoolName}.{WorkerGroup}"
    enum="BooleanHit" expires_after="2027-02-28">
  <owner>spvm@chromium.org</owner>
  <owner>gab@chromium.org</owner>
  <summary>
    Records a hit when a thread pool worker thread woke up unnecessarily (when
    the first GetWork called by a WorkerThread post-wakeup doesn't return a
    task). This count can be compared between experiments aiming to reduce
    wakeups. Or, it could be used to derive wakeups/(foo) by using UMA formulas
    against other time-or-event-based metrics. {ThreadPoolName} {WorkerGroup}
  </summary>
  <token key="ThreadPoolName">
    <variant name="Browser" summary="ThreadPool for the browser process."/>
    <variant name="ContentChild"
        summary="ThreadPools for various instantiations of
                 content::ChildProcess."/>
    <variant name="GPU" summary="ThreadPool for the gpu process."/>
    <variant name="Renderer" summary="ThreadPools for renderer processes."/>
  </token>
  <token key="WorkerGroup">
    <variant name="Background"
        summary="Applies to the Background priority worker group."/>
    <variant name="Foreground"
        summary="Applies to the Foreground priority worker group."/>
  </token>
</histogram>

</histograms>

</histogram-configuration>
