// Copyright 2016 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. #ifndef BASE_TASK_TASK_SCHEDULER_SCHEDULER_WORKER_STACK_H_ #define BASE_TASK_TASK_SCHEDULER_SCHEDULER_WORKER_STACK_H_ #include #include #include "base/base_export.h" #include "base/macros.h" namespace base { namespace internal { class SchedulerWorker; // A stack of SchedulerWorkers which has custom logic to treat the worker on top // of the stack as being "in-use" (so its time in that position doesn't count // towards being inactive / reclaimable). Supports removal of arbitrary // SchedulerWorkers. DCHECKs when a SchedulerWorker is inserted multiple times. // SchedulerWorkers are not owned by the stack. Push() is amortized O(1). Pop(), // Peek(), Size() and Empty() are O(1). Contains() and Remove() are O(n). This // class is NOT thread-safe. class BASE_EXPORT SchedulerWorkerStack { public: SchedulerWorkerStack(); ~SchedulerWorkerStack(); // Inserts |worker| at the top of the stack. |worker| must not already be on // the stack. Flags the SchedulerWorker previously on top of the stack, if // any, as unused. void Push(SchedulerWorker* worker); // Removes the top SchedulerWorker from the stack and returns it. Returns // nullptr if the stack is empty. Flags the SchedulerWorker now on top of the // stack, if any, as being in-use. SchedulerWorker* Pop(); // Returns the top SchedulerWorker from the stack, nullptr if empty. SchedulerWorker* Peek() const; // Returns true if |worker| is already on the stack. bool Contains(const SchedulerWorker* worker) const; // Removes |worker| from the stack. Must not be invoked for the first worker // on the stack. void Remove(const SchedulerWorker* worker); // Returns the number of SchedulerWorkers on the stack. size_t Size() const { return stack_.size(); } // Returns true if the stack is empty. bool IsEmpty() const { return stack_.empty(); } private: std::vector stack_; DISALLOW_COPY_AND_ASSIGN(SchedulerWorkerStack); }; } // namespace internal } // namespace base #endif // BASE_TASK_TASK_SCHEDULER_SCHEDULER_WORKER_STACK_H_