// Copyright 2018 The Chromium Authors // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. #ifndef BASE_TASK_SEQUENCE_MANAGER_LAZILY_DEALLOCATED_DEQUE_H_ #define BASE_TASK_SEQUENCE_MANAGER_LAZILY_DEALLOCATED_DEQUE_H_ #include <algorithm> #include <cmath> #include <limits> #include <memory> #include <utility> #include <vector> #include "base/check.h" #include "base/check_op.h" #include "base/containers/span.h" #include "base/debug/alias.h" #include "base/gtest_prod_util.h" #include "base/memory/raw_ptr.h" #include "base/memory/raw_ptr_exclusion.h" #include "base/memory/raw_span.h" #include "base/time/time.h" namespace base { namespace sequence_manager { namespace internal { // A LazilyDeallocatedDeque specialized for the SequenceManager's usage // patterns. The queue generally grows while tasks are added and then removed // until empty and the cycle repeats. // // The main difference between sequence_manager::LazilyDeallocatedDeque and // others is memory management. For performance (memory allocation isn't free) // we don't automatically reclaiming memory when the queue becomes empty. // Instead we rely on the surrounding code periodically calling // MaybeShrinkQueue, ideally when the queue is empty. // // We keep track of the maximum recent queue size and rate limit // MaybeShrinkQueue to avoid unnecessary churn. // // NB this queue isn't by itself thread safe. template <typename T, TimeTicks (*now_source)() = TimeTicks::Now> class LazilyDeallocatedDeque { … }; } // namespace internal } // namespace sequence_manager } // namespace base #endif // BASE_TASK_SEQUENCE_MANAGER_LAZILY_DEALLOCATED_DEQUE_H_