[go: nahoru, domu]

blob: 53dcd9e5c54f8c3163f4bd1bb5099cb65750f7ed [file] [log] [blame]
// Copyright 2017 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef COMPONENTS_DOWNLOAD_INTERNAL_BACKGROUND_SERVICE_SCHEDULER_SCHEDULER_IMPL_H_
#define COMPONENTS_DOWNLOAD_INTERNAL_BACKGROUND_SERVICE_SCHEDULER_SCHEDULER_IMPL_H_
#include "base/memory/raw_ptr.h"
#include "components/download/internal/background_service/scheduler/scheduler.h"
#include <map>
#include <vector>
#include "components/download/internal/background_service/entry.h"
namespace download {
class ClientSet;
class TaskScheduler;
struct Configuration;
// Scheduler implementation that
// 1. Creates platform background task based on the states of download entries.
// 2. Polls the next entry to be processed by the service mainly according to
// scheduling parameters and current device status.
//
// Provides load balancing between download clients using the service.
class SchedulerImpl : public Scheduler {
public:
SchedulerImpl(TaskScheduler* task_scheduler,
Configuration* config,
const ClientSet* clients);
SchedulerImpl(TaskScheduler* task_scheduler,
Configuration* config,
const std::vector<DownloadClient>& clients);
SchedulerImpl(const SchedulerImpl&) = delete;
SchedulerImpl& operator=(const SchedulerImpl&) = delete;
~SchedulerImpl() override;
// Scheduler implementation.
void Reschedule(const Model::EntryList& entries) override;
Entry* Next(const Model::EntryList& entries,
const DeviceStatus& device_status) override;
private:
// Finds a candidate for each download client to be processed next by the
// service.
// The candidates are selected based on scheduling parameters and current
// device status.
std::map<DownloadClient, Entry*> FindCandidates(
const Model::EntryList& entries,
const DeviceStatus& device_status);
// Used to create platform dependent background tasks.
raw_ptr<TaskScheduler, DanglingAcrossTasks> task_scheduler_;
// Download service configuration.
raw_ptr<Configuration, DanglingUntriaged> config_;
// List of all download client id, used in round robin load balancing.
// Downloads will be delivered to clients with incremental order based on
// the index of this list.
const std::vector<DownloadClient> download_clients_;
// The index of the current client.
// See |download_clients_|.
size_t current_client_index_;
};
} // namespace download
#endif // COMPONENTS_DOWNLOAD_INTERNAL_BACKGROUND_SERVICE_SCHEDULER_SCHEDULER_IMPL_H_