mirror of
https://github.com/klzgrad/naiveproxy.git
synced 2024-12-01 01:36:09 +03:00
124 lines
3.1 KiB
C
124 lines
3.1 KiB
C
|
// Copyright 2013 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_MESSAGE_LOOP_PENDING_TASK_QUEUE_H_
|
||
|
#define BASE_MESSAGE_LOOP_PENDING_TASK_QUEUE_H_
|
||
|
|
||
|
#include "base/macros.h"
|
||
|
#include "base/pending_task.h"
|
||
|
#include "base/sequence_checker.h"
|
||
|
|
||
|
namespace base {
|
||
|
namespace internal {
|
||
|
|
||
|
// Provides storage for tasks deferred by MessageLoop via DelayedQueue and
|
||
|
// DeferredQueue.
|
||
|
class PendingTaskQueue {
|
||
|
public:
|
||
|
// Provides a read-write task queue.
|
||
|
class Queue {
|
||
|
public:
|
||
|
Queue() = default;
|
||
|
virtual ~Queue() = default;
|
||
|
|
||
|
// Returns the next task. HasTasks() is assumed to be true.
|
||
|
virtual const PendingTask& Peek() = 0;
|
||
|
|
||
|
// Removes and returns the next task. HasTasks() is assumed to be true.
|
||
|
virtual PendingTask Pop() = 0;
|
||
|
|
||
|
// Whether this queue has tasks.
|
||
|
virtual bool HasTasks() = 0;
|
||
|
|
||
|
// Removes all tasks.
|
||
|
virtual void Clear() = 0;
|
||
|
|
||
|
// Adds the task to the end of the queue.
|
||
|
virtual void Push(PendingTask pending_task) = 0;
|
||
|
|
||
|
private:
|
||
|
DISALLOW_COPY_AND_ASSIGN(Queue);
|
||
|
};
|
||
|
|
||
|
PendingTaskQueue();
|
||
|
~PendingTaskQueue();
|
||
|
|
||
|
Queue& delayed_tasks() { return delayed_tasks_; }
|
||
|
|
||
|
Queue& deferred_tasks() { return deferred_tasks_; }
|
||
|
|
||
|
bool HasPendingHighResolutionTasks() const {
|
||
|
return delayed_tasks_.HasPendingHighResolutionTasks();
|
||
|
}
|
||
|
|
||
|
// Reports UMA metrics about its queues before the MessageLoop goes to sleep
|
||
|
// per being idle.
|
||
|
void ReportMetricsOnIdle() const;
|
||
|
|
||
|
private:
|
||
|
// The queue for holding tasks that should be run later and sorted by expected
|
||
|
// run time.
|
||
|
class DelayedQueue : public Queue {
|
||
|
public:
|
||
|
DelayedQueue();
|
||
|
~DelayedQueue() override;
|
||
|
|
||
|
// Queue:
|
||
|
const PendingTask& Peek() override;
|
||
|
PendingTask Pop() override;
|
||
|
// Whether this queue has tasks after sweeping the cancelled ones in front.
|
||
|
bool HasTasks() override;
|
||
|
void Clear() override;
|
||
|
void Push(PendingTask pending_task) override;
|
||
|
|
||
|
size_t Size() const;
|
||
|
bool HasPendingHighResolutionTasks() const {
|
||
|
DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
|
||
|
return pending_high_res_tasks_ > 0;
|
||
|
}
|
||
|
|
||
|
private:
|
||
|
DelayedTaskQueue queue_;
|
||
|
|
||
|
// Number of high resolution tasks in |queue_|.
|
||
|
int pending_high_res_tasks_ = 0;
|
||
|
|
||
|
SEQUENCE_CHECKER(sequence_checker_);
|
||
|
|
||
|
DISALLOW_COPY_AND_ASSIGN(DelayedQueue);
|
||
|
};
|
||
|
|
||
|
// The queue for holding tasks that couldn't be run while the MessageLoop was
|
||
|
// nested. These are generally processed during the idle stage.
|
||
|
class DeferredQueue : public Queue {
|
||
|
public:
|
||
|
DeferredQueue();
|
||
|
~DeferredQueue() override;
|
||
|
|
||
|
// Queue:
|
||
|
const PendingTask& Peek() override;
|
||
|
PendingTask Pop() override;
|
||
|
bool HasTasks() override;
|
||
|
void Clear() override;
|
||
|
void Push(PendingTask pending_task) override;
|
||
|
|
||
|
private:
|
||
|
TaskQueue queue_;
|
||
|
|
||
|
SEQUENCE_CHECKER(sequence_checker_);
|
||
|
|
||
|
DISALLOW_COPY_AND_ASSIGN(DeferredQueue);
|
||
|
};
|
||
|
|
||
|
DelayedQueue delayed_tasks_;
|
||
|
DeferredQueue deferred_tasks_;
|
||
|
|
||
|
DISALLOW_COPY_AND_ASSIGN(PendingTaskQueue);
|
||
|
};
|
||
|
|
||
|
} // namespace internal
|
||
|
} // namespace base
|
||
|
|
||
|
#endif // BASE_MESSAGE_LOOP_PENDING_TASK_QUEUE_H_
|