mirror of
https://github.com/Drop-OSS/drop-app.git
synced 2025-11-13 16:22:43 +10:00
Queue is running game downloads sequentially now
This commit is contained in:
@ -67,12 +67,15 @@ impl GameDownloadAgent {
|
|||||||
self.ensure_manifest_exists().await
|
self.ensure_manifest_exists().await
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn begin_download(&self, max_threads: usize) -> Result<(), GameDownloadError> {
|
pub async fn begin_download(&self, max_threads: usize) -> Result<(), GameDownloadError> {
|
||||||
self.change_state(GameDownloadState::Downloading);
|
self.change_state(GameDownloadState::Downloading);
|
||||||
// TODO we're coping the whole context thing
|
// TODO we're coping the whole context thing
|
||||||
// It's not necessary, I just can't figure out to make the borrow checker happy
|
// It's not necessary, I just can't figure out to make the borrow checker happy
|
||||||
self.progress
|
{
|
||||||
.run_contexts_parallel(self.contexts.lock().unwrap().to_vec(), max_threads);
|
let lock = self.contexts.lock().unwrap().to_vec();
|
||||||
|
self.progress
|
||||||
|
.run_context_parallel(lock, max_threads).await;
|
||||||
|
}
|
||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -46,8 +46,8 @@ pub async fn start_game_downloads(
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
info!("Downloading game");
|
info!("Downloading game");
|
||||||
start_game_download(max_threads, download_agent.unwrap()).await?;
|
|
||||||
{
|
{
|
||||||
|
start_game_download(max_threads, download_agent.unwrap()).await?;
|
||||||
let mut lock = state.lock().unwrap();
|
let mut lock = state.lock().unwrap();
|
||||||
lock.game_downloads.remove_entry(¤t_id);
|
lock.game_downloads.remove_entry(¤t_id);
|
||||||
}
|
}
|
||||||
@ -70,7 +70,7 @@ pub async fn start_game_download(
|
|||||||
|
|
||||||
download_agent.generate_job_contexts(&local_manifest, download_agent.version.clone(), download_agent.id.clone()).unwrap();
|
download_agent.generate_job_contexts(&local_manifest, download_agent.version.clone(), download_agent.id.clone()).unwrap();
|
||||||
|
|
||||||
download_agent.begin_download(max_threads)?;
|
download_agent.begin_download(max_threads).await?;
|
||||||
|
|
||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
@ -1,4 +1,6 @@
|
|||||||
use rayon::ThreadPoolBuilder;
|
use rayon::ThreadPoolBuilder;
|
||||||
|
use uuid::timestamp::context;
|
||||||
|
use std::os::unix::thread;
|
||||||
use std::sync::atomic::{AtomicUsize, Ordering};
|
use std::sync::atomic::{AtomicUsize, Ordering};
|
||||||
use std::sync::Arc;
|
use std::sync::Arc;
|
||||||
|
|
||||||
@ -35,7 +37,7 @@ where
|
|||||||
self.counter.fetch_add(1, Ordering::Relaxed);
|
self.counter.fetch_add(1, Ordering::Relaxed);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
pub fn run_contexts_parallel(&self, contexts: Vec<T>, max_threads: usize) {
|
pub fn run_contexts_parallel_background(&self, contexts: Vec<T>, max_threads: usize) {
|
||||||
let threads = ThreadPoolBuilder::new()
|
let threads = ThreadPoolBuilder::new()
|
||||||
// If max_threads == 0, then the limit will be determined
|
// If max_threads == 0, then the limit will be determined
|
||||||
// by Rayon's internal RAYON_NUM_THREADS
|
// by Rayon's internal RAYON_NUM_THREADS
|
||||||
@ -48,6 +50,20 @@ where
|
|||||||
threads.spawn(move || f(context));
|
threads.spawn(move || f(context));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
pub async fn run_context_parallel(&self, contexts: Vec<T>, max_threads: usize) {
|
||||||
|
let threads = ThreadPoolBuilder::new()
|
||||||
|
.num_threads(max_threads)
|
||||||
|
.build()
|
||||||
|
.unwrap();
|
||||||
|
|
||||||
|
threads.scope(|s| {
|
||||||
|
for context in contexts {
|
||||||
|
let f = self.f.clone();
|
||||||
|
s.spawn(move |_| f(context));
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
}
|
||||||
pub fn get_progress(&self) -> usize {
|
pub fn get_progress(&self) -> usize {
|
||||||
self.counter.load(Ordering::Relaxed)
|
self.counter.load(Ordering::Relaxed)
|
||||||
}
|
}
|
||||||
|
|||||||
@ -13,7 +13,7 @@ fn test_progress_sequentially() {
|
|||||||
fn test_progress_parallel() {
|
fn test_progress_parallel() {
|
||||||
let counter = Arc::new(AtomicUsize::new(0));
|
let counter = Arc::new(AtomicUsize::new(0));
|
||||||
let p = ProgressChecker::new(Box::new(test_fn), counter.clone());
|
let p = ProgressChecker::new(Box::new(test_fn), counter.clone());
|
||||||
p.run_contexts_parallel((1..100).collect(), 10);
|
p.run_contexts_parallel_background((1..100).collect(), 10);
|
||||||
}
|
}
|
||||||
|
|
||||||
fn test_fn(int: usize) {
|
fn test_fn(int: usize) {
|
||||||
|
|||||||
Reference in New Issue
Block a user