|  | // 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 <vector> | 
|  |  | 
|  | #include "base/base_export.h" | 
|  | #include "base/macros.h" | 
|  | #include "starboard/types.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<SchedulerWorker*> stack_; | 
|  |  | 
|  | DISALLOW_COPY_AND_ASSIGN(SchedulerWorkerStack); | 
|  | }; | 
|  |  | 
|  | }  // namespace internal | 
|  | }  // namespace base | 
|  |  | 
|  | #endif  // BASE_TASK_TASK_SCHEDULER_SCHEDULER_WORKER_STACK_H_ |