| Index: base/task_scheduler/priority_queue.h
|
| diff --git a/base/task_scheduler/priority_queue.h b/base/task_scheduler/priority_queue.h
|
| index 8e0a5321793343c64b5e146394588e0233e8cdeb..ac1dbdeb9778e2a02c60fb417783bff5e73e5f73 100644
|
| --- a/base/task_scheduler/priority_queue.h
|
| +++ b/base/task_scheduler/priority_queue.h
|
| @@ -23,27 +23,6 @@ namespace internal {
|
| // A PriorityQueue holds Sequences of Tasks. This class is thread-safe.
|
| class BASE_EXPORT PriorityQueue {
|
| public:
|
| - // An immutable struct combining a Sequence and the sort key that determines
|
| - // its position in a PriorityQueue.
|
| - struct BASE_EXPORT SequenceAndSortKey {
|
| - // Constructs a null SequenceAndSortKey.
|
| - SequenceAndSortKey();
|
| -
|
| - // Constructs a SequenceAndSortKey with the given |sequence| and |sort_key|.
|
| - SequenceAndSortKey(scoped_refptr<Sequence> sequence,
|
| - const SequenceSortKey& sort_key);
|
| - ~SequenceAndSortKey();
|
| -
|
| - // Returns true if this is a null SequenceAndSortKey.
|
| - bool is_null() const { return !sequence; }
|
| -
|
| - const scoped_refptr<Sequence> sequence;
|
| - const SequenceSortKey sort_key;
|
| -
|
| - private:
|
| - DISALLOW_COPY_AND_ASSIGN(SequenceAndSortKey);
|
| - };
|
| -
|
| // A Transaction can perform multiple operations atomically on a
|
| // PriorityQueue. While a Transaction is alive, it is guaranteed that nothing
|
| // else will access the PriorityQueue.
|
| @@ -57,17 +36,25 @@ class BASE_EXPORT PriorityQueue {
|
| public:
|
| ~Transaction();
|
|
|
| - // Inserts |sequence_and_sort_key| in the PriorityQueue.
|
| - void Push(std::unique_ptr<SequenceAndSortKey> sequence_and_sort_key);
|
| + // Inserts |sequence| in the PriorityQueue with |sequence_sort_key|.
|
| + // Note: |sequence_sort_key| is required as a parameter instead of being
|
| + // extracted from |sequence| in Push() to avoid this Transaction having a
|
| + // lock interdependency with |sequence|.
|
| + void Push(scoped_refptr<Sequence> sequence,
|
| + const SequenceSortKey& sequence_sort_key);
|
| +
|
| + // Returns a reference to the SequenceSortKey representing the priority of
|
| + // the highest pending task in this PriorityQueue. The reference becomes
|
| + // invalid the next time that this PriorityQueue is modified.
|
| + // Cannot be called on an empty PriorityQueue.
|
| + const SequenceSortKey& PeekSortKey() const;
|
|
|
| - // Returns the SequenceAndSortKey with the highest priority or a null
|
| - // SequenceAndSortKey if the PriorityQueue is empty. The reference becomes
|
| - // invalid the next time that a Sequence is popped from the PriorityQueue.
|
| - const SequenceAndSortKey& Peek() const;
|
| + // Removes and returns the highest priority Sequence in this PriorityQueue.
|
| + // Cannot be called on an empty PriorityQueue.
|
| + scoped_refptr<Sequence> PopSequence();
|
|
|
| - // Removes the SequenceAndSortKey with the highest priority from the
|
| - // PriorityQueue. Cannot be called on an empty PriorityQueue.
|
| - void Pop();
|
| + // Returns true if the PriorityQueue is empty.
|
| + bool IsEmpty() const;
|
|
|
| private:
|
| friend class PriorityQueue;
|
| @@ -100,26 +87,17 @@ class BASE_EXPORT PriorityQueue {
|
| const SchedulerLock* container_lock() const { return &container_lock_; }
|
|
|
| private:
|
| - struct SequenceAndSortKeyComparator {
|
| - bool operator()(const std::unique_ptr<SequenceAndSortKey>& left,
|
| - const std::unique_ptr<SequenceAndSortKey>& right) const {
|
| - return left->sort_key < right->sort_key;
|
| - }
|
| - };
|
| - using ContainerType =
|
| - std::priority_queue<std::unique_ptr<SequenceAndSortKey>,
|
| - std::vector<std::unique_ptr<SequenceAndSortKey>>,
|
| - SequenceAndSortKeyComparator>;
|
| + // A class combining a Sequence and the SequenceSortKey that determines its
|
| + // position in a PriorityQueue.
|
| + class SequenceAndSortKey;
|
| +
|
| + using ContainerType = std::priority_queue<SequenceAndSortKey>;
|
|
|
| // Synchronizes access to |container_|.
|
| SchedulerLock container_lock_;
|
|
|
| ContainerType container_;
|
|
|
| - // A null SequenceAndSortKey returned by Peek() when the PriorityQueue is
|
| - // empty.
|
| - const SequenceAndSortKey empty_sequence_and_sort_key_;
|
| -
|
| DISALLOW_COPY_AND_ASSIGN(PriorityQueue);
|
| };
|
|
|
|
|