use std::collections::{HashMap, HashSet, VecDeque};
use std::sync::{Arc, RwLock};
use crate::ids::{GlobalProgressListenerId, TaskId};
use super::active_state::ActiveState;
use super::cb_dispatcher::CbSubmit;
use super::group_state::GroupState;
use super::task_callbacks::ProgressCb;
use super::UniqueId;
pub(crate) struct SchedulerState {
max_upload_concurrency: usize,
max_download_concurrency: usize,
global_progress_listener: Arc<RwLock<Vec<(GlobalProgressListenerId, ProgressCb)>>>,
groups: HashMap<UniqueId, GroupState>,
task_id_to_dedupe: HashMap<TaskId, UniqueId>,
queued: VecDeque<UniqueId>,
queued_set: HashSet<UniqueId>,
paused_set: HashSet<UniqueId>,
active: HashMap<UniqueId, ActiveState>,
offsets: HashMap<UniqueId, u64>,
cb_submit: Option<CbSubmit>,
}
impl SchedulerState {
pub(crate) fn new(
max_upload_concurrency: usize,
max_download_concurrency: usize,
global_progress_listener: Arc<RwLock<Vec<(GlobalProgressListenerId, ProgressCb)>>>,
cb_submit: CbSubmit,
) -> Self {
Self {
max_upload_concurrency,
max_download_concurrency,
global_progress_listener,
groups: HashMap::new(),
task_id_to_dedupe: HashMap::new(),
queued: VecDeque::new(),
queued_set: HashSet::new(),
paused_set: HashSet::new(),
active: HashMap::new(),
offsets: HashMap::new(),
cb_submit: Some(cb_submit),
}
}
pub(crate) fn max_upload_concurrency(&self) -> usize {
self.max_upload_concurrency
}
pub(crate) fn max_download_concurrency(&self) -> usize {
self.max_download_concurrency
}
pub(crate) fn global_progress_listener(
&self,
) -> &Arc<RwLock<Vec<(GlobalProgressListenerId, ProgressCb)>>> {
&self.global_progress_listener
}
pub(crate) fn groups(&self) -> &HashMap<UniqueId, GroupState> {
&self.groups
}
pub(crate) fn groups_mut(&mut self) -> &mut HashMap<UniqueId, GroupState> {
&mut self.groups
}
pub(crate) fn queued(&self) -> &VecDeque<UniqueId> {
&self.queued
}
pub(crate) fn queued_mut(&mut self) -> &mut VecDeque<UniqueId> {
&mut self.queued
}
pub(crate) fn queued_set(&self) -> &HashSet<UniqueId> {
&self.queued_set
}
pub(crate) fn queued_set_mut(&mut self) -> &mut HashSet<UniqueId> {
&mut self.queued_set
}
pub(crate) fn paused_set(&self) -> &HashSet<UniqueId> {
&self.paused_set
}
pub(crate) fn paused_set_mut(&mut self) -> &mut HashSet<UniqueId> {
&mut self.paused_set
}
pub(crate) fn active(&self) -> &HashMap<UniqueId, ActiveState> {
&self.active
}
pub(crate) fn active_mut(&mut self) -> &mut HashMap<UniqueId, ActiveState> {
&mut self.active
}
pub(crate) fn offsets(&self) -> &HashMap<UniqueId, u64> {
&self.offsets
}
pub(crate) fn offsets_mut(&mut self) -> &mut HashMap<UniqueId, u64> {
&mut self.offsets
}
pub(crate) fn task_id_to_dedupe(&self) -> &HashMap<TaskId, UniqueId> {
&self.task_id_to_dedupe
}
pub(crate) fn task_id_to_dedupe_mut(&mut self) -> &mut HashMap<TaskId, UniqueId> {
&mut self.task_id_to_dedupe
}
pub(crate) fn cb_submit(&self) -> Option<&CbSubmit> {
self.cb_submit.as_ref()
}
pub(crate) fn take_cb_submit(&mut self) -> Option<CbSubmit> {
self.cb_submit.take()
}
}