From abb283b20694ecb8ed3ad6864661bc1adc64f56c Mon Sep 17 00:00:00 2001 From: Gabriele Musco Date: Tue, 5 Sep 2023 13:49:34 +0000 Subject: [PATCH] feat: cleanup, remove old runner from build tools --- src/build_tools/cmake.rs | 43 +---- src/build_tools/git.rs | 112 +------------ src/builders/build_basalt.rs | 93 +---------- src/builders/build_libsurvive.rs | 58 +------ src/builders/build_mercury.rs | 17 +- src/builders/build_monado.rs | 64 +------- src/builders/build_opencomposite.rs | 54 +------ src/builders/build_wivrn.rs | 51 +----- src/ui/app.rs | 22 +-- .../internal_worker.rs} | 153 +++--------------- src/ui/job_worker/job.rs | 41 +++++ src/ui/job_worker/mod.rs | 82 ++++++++++ src/ui/job_worker/state.rs | 10 ++ src/ui/mod.rs | 2 +- src/ui/workers/mod.rs | 1 - 15 files changed, 200 insertions(+), 603 deletions(-) rename src/ui/{workers/runner_worker.rs => job_worker/internal_worker.rs} (57%) create mode 100644 src/ui/job_worker/job.rs create mode 100644 src/ui/job_worker/mod.rs create mode 100644 src/ui/job_worker/state.rs delete mode 100644 src/ui/workers/mod.rs diff --git a/src/build_tools/cmake.rs b/src/build_tools/cmake.rs index 5628a44..1f3d39b 100644 --- a/src/build_tools/cmake.rs +++ b/src/build_tools/cmake.rs @@ -1,4 +1,4 @@ -use crate::{cmd_runner::CmdRunner, ui::workers::runner_worker::WorkerJob}; +use crate::ui::job_worker::job::WorkerJob; use std::collections::HashMap; #[derive(Debug, Clone)] @@ -10,30 +10,6 @@ pub struct Cmake { } impl Cmake { - #[deprecated] - pub fn get_prepare_runner(&self) -> CmdRunner { - let mut args = vec![ - "-B".into(), - self.build_dir.clone(), - "-G".into(), - "Ninja".into(), - ]; - if self.vars.is_some() { - for (k, v) in self.vars.as_ref().unwrap() { - if k.contains(' ') { - panic!("Cmake vars cannot contain spaces!"); - } - if v.contains(' ') { - args.push(format!("-D{k}=\"{v}\"", k = k, v = v)); - } else { - args.push(format!("-D{k}={v}", k = k, v = v)); - } - } - } - args.push(self.source_dir.clone()); - CmdRunner::new(self.env.clone(), "cmake".into(), args) - } - pub fn get_prepare_job(&self) -> WorkerJob { let mut args = vec![ "-B".into(), @@ -57,14 +33,6 @@ impl Cmake { WorkerJob::new_cmd(self.env.clone(), "cmake".into(), Some(args)) } - #[deprecated] - pub fn get_build_runner(&self) -> CmdRunner { - CmdRunner::new( - self.env.clone(), - "cmake".into(), - vec!["--build".into(), self.build_dir.clone()], - ) - } pub fn get_build_job(&self) -> WorkerJob { WorkerJob::new_cmd( self.env.clone(), @@ -73,15 +41,6 @@ impl Cmake { ) } - #[deprecated] - pub fn get_install_runner(&self) -> CmdRunner { - CmdRunner::new( - self.env.clone(), - "cmake".into(), - vec!["--install".into(), self.build_dir.clone()], - ) - } - pub fn get_install_job(&self) -> WorkerJob { WorkerJob::new_cmd( self.env.clone(), diff --git a/src/build_tools/git.rs b/src/build_tools/git.rs index c61da07..c7552d3 100644 --- a/src/build_tools/git.rs +++ b/src/build_tools/git.rs @@ -1,8 +1,6 @@ use crate::{ - cmd_runner::CmdRunner, - func_runner::{FuncRunner, FuncRunnerOut}, profile::Profile, - ui::workers::runner_worker::{FuncWorkerOut, WorkerJob}, + ui::job_worker::job::{FuncWorkerOut, WorkerJob}, }; use git2::Repository; use std::path::Path; @@ -28,20 +26,6 @@ impl Git { split.next().map(|s| s.into()) } - #[deprecated] - pub fn get_reset_runner(&self) -> CmdRunner { - CmdRunner::new( - None, - "git".into(), - vec![ - "-C".into(), - self.dir.clone(), - "reset".into(), - "--hard".into(), - ], - ) - } - pub fn get_reset_job(&self) -> WorkerJob { WorkerJob::new_cmd( None, @@ -55,43 +39,6 @@ impl Git { ) } - #[deprecated] - pub fn get_override_remote_url_runner(&self) -> FuncRunner { - let dir = self.dir.clone(); - let n_remote_url = self.get_repo(); - FuncRunner::new(Box::new(move || { - if let Ok(repo) = Repository::open(dir) { - if let Ok(remote) = repo.find_remote("origin") { - if remote.url().unwrap_or("") != n_remote_url { - if repo.remote_set_url("origin", &n_remote_url).is_ok() { - return FuncRunnerOut { - success: true, - out: vec![], - }; - } - return FuncRunnerOut { - success: false, - out: vec!["Failed to set origin remote url".into()], - }; - } - } else { - return FuncRunnerOut { - success: false, - out: vec!["Could not find remote origin".into()], - }; - } - return FuncRunnerOut { - success: true, - out: vec![], - }; - } - FuncRunnerOut { - success: true, - out: vec![], - } - })) - } - pub fn get_override_remote_url_job(&self) -> WorkerJob { let dir = self.dir.clone(); let n_remote_url = self.get_repo(); @@ -128,15 +75,6 @@ impl Git { })) } - #[deprecated] - pub fn get_pull_runner(&self) -> CmdRunner { - CmdRunner::new( - None, - "git".into(), - vec!["-C".into(), self.dir.clone(), "pull".into()], - ) - } - pub fn get_pull_job(&self) -> WorkerJob { WorkerJob::new_cmd( None, @@ -145,20 +83,6 @@ impl Git { ) } - #[deprecated] - pub fn get_clone_runner(&self) -> CmdRunner { - CmdRunner::new( - None, - "git".into(), - vec![ - "clone".into(), - self.get_repo(), - self.dir.clone(), - "--recurse-submodules".into(), - ], - ) - } - pub fn get_clone_job(&self) -> WorkerJob { WorkerJob::new_cmd( None, @@ -172,17 +96,6 @@ impl Git { ) } - #[deprecated] - pub fn get_checkout_ref_runner(&self) -> Option { - self.get_ref().map(|r| { - CmdRunner::new( - None, - "git".into(), - vec!["-C".into(), self.dir.clone(), "checkout".into(), r], - ) - }) - } - pub fn get_checkout_ref_job(&self) -> Option { self.get_ref().map(|r| { WorkerJob::new_cmd( @@ -193,16 +106,6 @@ impl Git { }) } - #[deprecated] - pub fn get_clone_or_not_runner(&self) -> Option { - let path_s = format!("{}/.git", self.dir.clone()); - let path = Path::new(&path_s); - if path.is_dir() { - return None; - } - Some(self.get_clone_runner()) - } - pub fn get_clone_or_not_job(&self) -> Option { let path_s = format!("{}/.git", self.dir.clone()); let path = Path::new(&path_s); @@ -212,24 +115,13 @@ impl Git { Some(self.get_clone_job()) } - #[deprecated] - pub fn clone_or_pull(&self, profile: &Profile) -> Option { - match self.get_clone_or_not_runner() { - Some(r) => Some(r), - None => match profile.pull_on_build { - true => Some(self.get_pull_runner()), - false => None, - }, - } - } - pub fn get_clone_or_pull_job(&self, profile: &Profile) -> Option { match self.get_clone_or_not_job() { Some(j) => Some(j), None => match profile.pull_on_build { true => Some(self.get_pull_job()), false => None, - } + }, } } } diff --git a/src/builders/build_basalt.rs b/src/builders/build_basalt.rs index fda3410..6a6c535 100644 --- a/src/builders/build_basalt.rs +++ b/src/builders/build_basalt.rs @@ -1,11 +1,13 @@ use crate::{ build_tools::{cmake::Cmake, git::Git}, - cmd_runner::CmdRunner, file_utils::rm_rf, profile::Profile, - runner::Runner, ui::workers::runner_worker::WorkerJob, + ui::job_worker::job::WorkerJob, +}; +use std::{ + collections::{HashMap, VecDeque}, + path::Path, }; -use std::{collections::{HashMap, VecDeque}, path::Path}; pub fn get_build_basalt_jobs(profile: &Profile, clean_build: bool) -> VecDeque { let mut jobs = VecDeque::::new(); @@ -19,7 +21,7 @@ pub fn get_build_basalt_jobs(profile: &Profile, clean_build: bool) -> VecDeque VecDeque Vec> { - let mut runners: Vec> = vec![]; - let git = Git { - repo: match profile.features.basalt.repo.as_ref() { - Some(r) => r.clone(), - None => "https://gitlab.freedesktop.org/mateosss/basalt.git".into(), - }, - dir: profile.features.basalt.path.as_ref().unwrap().clone(), - }; - runners.push(Box::new(git.get_override_remote_url_runner())); - if let Some(r) = git.clone_or_pull(profile) { - runners.push(Box::new(r)); - }; - if let Some(r) = git.get_checkout_ref_runner() { - runners.push(Box::new(r)); - if profile.pull_on_build { - runners.push(Box::new(git.get_pull_runner())); - } - } - - let build_dir = format!("{}/build", profile.features.basalt.path.as_ref().unwrap()); - let mut cmake_vars: HashMap = HashMap::new(); - cmake_vars.insert("CMAKE_BUILD_TYPE".into(), "Release".into()); - cmake_vars.insert("CMAKE_INSTALL_PREFIX".into(), profile.prefix.clone()); - cmake_vars.insert("BUILD_TESTS".into(), "OFF".into()); - cmake_vars.insert("BASALT_INSTANTIATIONS_DOUBLE".into(), "OFF".into()); - cmake_vars.insert( - "CMAKE_INSTALL_LIBDIR".into(), - format!("{}/lib", profile.prefix), - ); - - let mut cmake_env: HashMap = HashMap::new(); - cmake_env.insert("CMAKE_BUILD_PARALLEL_LEVEL".into(), "2".into()); - - let cmake = Cmake { - env: Some(cmake_env), - vars: Some(cmake_vars), - source_dir: profile.features.basalt.path.as_ref().unwrap().clone(), - build_dir: build_dir.clone(), - }; - runners.push(Box::new(CmdRunner::new(None, "bash".into(), vec![ - "-c".into(), - format!( - "cd {repo}/thirdparty/Pangolin && git checkout include/pangolin/utils/picojson.h && curl -sSL 'https://aur.archlinux.org/cgit/aur.git/plain/279c17d9c9eb9374c89489b449f92cb93350e8cd.patch?h=basalt-monado-git' -o picojson_fix.patch && git apply picojson_fix.patch && sed -i '1s/^/#include \\n/' include/pangolin/platform.h", - repo = git.dir - ), - ]))); - if !Path::new(&build_dir).is_dir() || clean_build { - rm_rf(&build_dir); - runners.push(Box::new(cmake.get_prepare_runner())); - } - runners.push(Box::new(cmake.get_build_runner())); - runners.push(Box::new(cmake.get_install_runner())); - - runners.push(Box::new(CmdRunner::new( - None, - "mkdir".into(), - vec![ - "-p".into(), - format!( - "{}/share/basalt/thirdparty/basalt-headers/thirdparty", - profile.prefix - ), - ], - ))); - runners.push(Box::new(CmdRunner::new( - None, - "cp".into(), - vec![ - "-Ra".into(), - format!( - "{}/thirdparty/basalt-headers/thirdparty/eigen", - profile.features.basalt.path.as_ref().unwrap().clone() - ), - format!("{}/share/basalt/thirdparty", profile.prefix), - ], - ))); - - runners -} diff --git a/src/builders/build_libsurvive.rs b/src/builders/build_libsurvive.rs index 3f4ceb8..752d1ca 100644 --- a/src/builders/build_libsurvive.rs +++ b/src/builders/build_libsurvive.rs @@ -2,9 +2,12 @@ use crate::{ build_tools::{cmake::Cmake, git::Git}, file_utils::rm_rf, profile::Profile, - runner::Runner, ui::workers::runner_worker::WorkerJob, + ui::job_worker::job::WorkerJob, +}; +use std::{ + collections::{HashMap, VecDeque}, + path::Path, }; -use std::{collections::{HashMap, VecDeque}, path::Path}; pub fn get_build_libsurvive_jobs(profile: &Profile, clean_build: bool) -> VecDeque { let mut jobs = VecDeque::::new(); @@ -59,54 +62,3 @@ pub fn get_build_libsurvive_jobs(profile: &Profile, clean_build: bool) -> VecDeq jobs } - -#[deprecated] -pub fn get_build_libsurvive_runners(profile: &Profile, clean_build: bool) -> Vec> { - let mut runners: Vec> = vec![]; - let git = Git { - repo: match profile.features.libsurvive.repo.as_ref() { - Some(r) => r.clone(), - None => "https://github.com/cntools/libsurvive".into(), - }, - dir: profile.features.libsurvive.path.as_ref().unwrap().clone(), - }; - runners.push(Box::new(git.get_override_remote_url_runner())); - if let Some(r) = git.clone_or_pull(profile) { - runners.push(Box::new(r)); - }; - if let Some(r) = git.get_checkout_ref_runner() { - runners.push(Box::new(r)); - if profile.pull_on_build { - runners.push(Box::new(git.get_pull_runner())); - } - } - - let build_dir = format!( - "{}/build", - profile.features.libsurvive.path.as_ref().unwrap() - ); - let mut cmake_vars: HashMap = HashMap::new(); - cmake_vars.insert("CMAKE_BUILD_TYPE".into(), "Release".into()); - cmake_vars.insert("ENABLE_api_example".into(), "OFF".into()); - cmake_vars.insert("CMAKE_SKIP_INSTALL_RPATH".into(), "YES".into()); - cmake_vars.insert("CMAKE_INSTALL_PREFIX".into(), profile.prefix.clone()); - cmake_vars.insert( - "CMAKE_INSTALL_LIBDIR".into(), - format!("{}/lib", profile.prefix), - ); - - let cmake = Cmake { - env: None, - vars: Some(cmake_vars), - source_dir: profile.features.libsurvive.path.as_ref().unwrap().clone(), - build_dir: build_dir.clone(), - }; - if !Path::new(&build_dir).is_dir() || clean_build { - rm_rf(&build_dir); - runners.push(Box::new(cmake.get_prepare_runner())); - } - runners.push(Box::new(cmake.get_build_runner())); - runners.push(Box::new(cmake.get_install_runner())); - - runners -} diff --git a/src/builders/build_mercury.rs b/src/builders/build_mercury.rs index d1c79c3..43131a4 100644 --- a/src/builders/build_mercury.rs +++ b/src/builders/build_mercury.rs @@ -1,5 +1,5 @@ use crate::{ - cmd_runner::CmdRunner, constants::pkg_data_dir, paths::get_cache_dir, profile::Profile, ui::workers::runner_worker::WorkerJob, + constants::pkg_data_dir, paths::get_cache_dir, profile::Profile, ui::job_worker::job::WorkerJob, }; pub fn get_build_mercury_job(profile: &Profile) -> WorkerJob { @@ -9,19 +9,6 @@ pub fn get_build_mercury_job(profile: &Profile) -> WorkerJob { "{sysdata}/scripts/build_mercury.sh", sysdata = pkg_data_dir() ), - Some(vec![profile.prefix.clone(), get_cache_dir()]) - ) -} - -#[deprecated] -pub fn get_build_mercury_runner(profile: &Profile) -> CmdRunner { - let args = vec![profile.prefix.clone(), get_cache_dir()]; - CmdRunner::new( - None, - format!( - "{sysdata}/scripts/build_mercury.sh", - sysdata = pkg_data_dir() - ), - args, + Some(vec![profile.prefix.clone(), get_cache_dir()]), ) } diff --git a/src/builders/build_monado.rs b/src/builders/build_monado.rs index b3dbe67..6f59dcd 100644 --- a/src/builders/build_monado.rs +++ b/src/builders/build_monado.rs @@ -2,9 +2,12 @@ use crate::{ build_tools::{cmake::Cmake, git::Git}, file_utils::rm_rf, profile::Profile, - runner::Runner, ui::workers::runner_worker::WorkerJob, + ui::job_worker::job::WorkerJob, +}; +use std::{ + collections::{HashMap, VecDeque}, + path::Path, }; -use std::{collections::{HashMap, VecDeque}, path::Path}; pub fn get_build_monado_jobs(profile: &Profile, clean_build: bool) -> VecDeque { let mut jobs = VecDeque::::new(); @@ -64,60 +67,3 @@ pub fn get_build_monado_jobs(profile: &Profile, clean_build: bool) -> VecDeque Vec> { - let mut runners: Vec> = vec![]; - let git = Git { - repo: match profile.xrservice_repo.as_ref() { - Some(r) => r.clone(), - None => "https://gitlab.freedesktop.org/monado/monado".into(), - }, - dir: profile.xrservice_path.clone(), - }; - runners.push(Box::new(git.get_override_remote_url_runner())); - if let Some(r) = git.clone_or_pull(profile) { - runners.push(Box::new(r)); - } - if let Some(r) = git.get_checkout_ref_runner() { - runners.push(Box::new(r)); - if profile.pull_on_build { - runners.push(Box::new(git.get_pull_runner())); - } - } - - let build_dir = format!("{}/build", profile.xrservice_path); - let mut env: HashMap = HashMap::new(); - env.insert( - "PKG_CONFIG_PATH".into(), - format!("{}/lib/pkgconfig", profile.prefix), - ); - let mut cmake_vars: HashMap = HashMap::new(); - cmake_vars.insert("CMAKE_BUILD_TYPE".into(), "Release".into()); - cmake_vars.insert("XRT_HAVE_SYSTEM_CJSON".into(), "NO".into()); - cmake_vars.insert("CMAKE_LIBDIR".into(), format!("{}/lib", profile.prefix)); - cmake_vars.insert("CMAKE_INSTALL_PREFIX".into(), profile.prefix.clone()); - cmake_vars.insert( - "CMAKE_C_FLAGS".into(), - format!("-Wl,-rpath='{}/lib'", profile.prefix), - ); - cmake_vars.insert( - "CMAKE_CXX_FLAGS".into(), - format!("-Wl,-rpath='{}/lib'", profile.prefix), - ); - - let cmake = Cmake { - env: Some(env), - vars: Some(cmake_vars), - source_dir: profile.xrservice_path.clone(), - build_dir: build_dir.clone(), - }; - if !Path::new(&build_dir).is_dir() || clean_build { - rm_rf(&build_dir); - runners.push(Box::new(cmake.get_prepare_runner())); - } - runners.push(Box::new(cmake.get_build_runner())); - runners.push(Box::new(cmake.get_install_runner())); - - runners -} diff --git a/src/builders/build_opencomposite.rs b/src/builders/build_opencomposite.rs index 17f6fc9..1ab5c91 100644 --- a/src/builders/build_opencomposite.rs +++ b/src/builders/build_opencomposite.rs @@ -2,14 +2,14 @@ use crate::{ build_tools::{cmake::Cmake, git::Git}, file_utils::rm_rf, profile::Profile, - runner::Runner, ui::workers::runner_worker::WorkerJob, + ui::job_worker::job::WorkerJob, +}; +use std::{ + collections::{HashMap, VecDeque}, + path::Path, }; -use std::{collections::{HashMap, VecDeque}, path::Path}; -pub fn get_build_opencomposite_jobs( - profile: &Profile, - clean_build: bool, -) -> VecDeque { +pub fn get_build_opencomposite_jobs(profile: &Profile, clean_build: bool) -> VecDeque { let mut jobs = VecDeque::::new(); let git = Git { @@ -50,45 +50,3 @@ pub fn get_build_opencomposite_jobs( jobs } - -#[deprecated] -pub fn get_build_opencomposite_runners( - profile: &Profile, - clean_build: bool, -) -> Vec> { - let mut runners: Vec> = vec![]; - let git = Git { - repo: match profile.opencomposite_repo.as_ref() { - Some(r) => r.clone(), - None => "https://gitlab.com/znixian/OpenOVR.git".into(), - }, - dir: profile.opencomposite_path.clone(), - }; - runners.push(Box::new(git.get_override_remote_url_runner())); - if let Some(r) = git.clone_or_pull(profile) { - runners.push(Box::new(r)); - }; - if let Some(r) = git.get_checkout_ref_runner() { - runners.push(Box::new(r)); - if profile.pull_on_build { - runners.push(Box::new(git.get_pull_runner())); - } - } - - let build_dir = format!("{}/build", profile.opencomposite_path); - let mut cmake_vars: HashMap = HashMap::new(); - cmake_vars.insert("CMAKE_BUILD_TYPE".into(), "Release".into()); - let cmake = Cmake { - env: None, - vars: Some(cmake_vars), - source_dir: profile.opencomposite_path.clone(), - build_dir: build_dir.clone(), - }; - if !Path::new(&build_dir).is_dir() || clean_build { - rm_rf(&build_dir); - runners.push(Box::new(cmake.get_prepare_runner())); - } - runners.push(Box::new(cmake.get_build_runner())); - - runners -} diff --git a/src/builders/build_wivrn.rs b/src/builders/build_wivrn.rs index b62fe1b..7755a99 100644 --- a/src/builders/build_wivrn.rs +++ b/src/builders/build_wivrn.rs @@ -2,9 +2,12 @@ use crate::{ build_tools::{cmake::Cmake, git::Git}, file_utils::rm_rf, profile::Profile, - runner::Runner, ui::workers::runner_worker::WorkerJob, + ui::job_worker::job::WorkerJob, +}; +use std::{ + collections::{HashMap, VecDeque}, + path::Path, }; -use std::{collections::{HashMap, VecDeque}, path::Path}; pub fn get_build_wivrn_jobs(profile: &Profile, clean_build: bool) -> VecDeque { let mut jobs = VecDeque::::new(); @@ -52,47 +55,3 @@ pub fn get_build_wivrn_jobs(profile: &Profile, clean_build: bool) -> VecDeque Vec> { - let mut runners: Vec> = vec![]; - let git = Git { - repo: match profile.xrservice_repo.as_ref() { - Some(r) => r.clone(), - None => "https://github.com/Meumeu/WiVRn".into(), - }, - dir: profile.xrservice_path.clone(), - }; - runners.push(Box::new(git.get_override_remote_url_runner())); - if let Some(r) = git.clone_or_pull(profile) { - runners.push(Box::new(r)); - } - if let Some(r) = git.get_checkout_ref_runner() { - runners.push(Box::new(r)); - if profile.pull_on_build { - runners.push(Box::new(git.get_pull_runner())); - } - } - - let build_dir = format!("{}/build", profile.xrservice_path); - let mut cmake_vars: HashMap = HashMap::new(); - cmake_vars.insert("CMAKE_BUILD_TYPE".into(), "Release".into()); - cmake_vars.insert("XRT_HAVE_SYSTEM_CJSON".into(), "NO".into()); - cmake_vars.insert("WIVRN_BUILD_CLIENT".into(), "OFF".into()); - cmake_vars.insert("CMAKE_INSTALL_PREFIX".into(), profile.prefix.clone()); - - let cmake = Cmake { - env: None, - vars: Some(cmake_vars), - source_dir: profile.xrservice_path.clone(), - build_dir: build_dir.clone(), - }; - if !Path::new(&build_dir).is_dir() || clean_build { - rm_rf(&build_dir); - runners.push(Box::new(cmake.get_prepare_runner())); - } - runners.push(Box::new(cmake.get_build_runner())); - runners.push(Box::new(cmake.get_install_runner())); - - runners -} diff --git a/src/ui/app.rs b/src/ui/app.rs index 032f13e..db35dad 100644 --- a/src/ui/app.rs +++ b/src/ui/app.rs @@ -3,11 +3,11 @@ use super::alert::alert; use super::build_window::{BuildStatus, BuildWindow}; use super::debug_view::{DebugView, DebugViewMsg}; use super::fbt_config_editor::{FbtConfigEditor, FbtConfigEditorInit, FbtConfigEditorMsg}; +use super::job_worker::internal_worker::JobWorkerOut; +use super::job_worker::job::WorkerJob; +use super::job_worker::JobWorker; use super::libsurvive_setup_window::LibsurviveSetupWindow; use super::main_view::MainViewMsg; -use super::workers::runner_worker::{ - RunnerWorkerMsg, RunnerWorkerOut, RunnerWorkerWrap, WorkerJob, -}; use crate::builders::build_basalt::get_build_basalt_jobs; use crate::builders::build_libsurvive::get_build_libsurvive_jobs; use crate::builders::build_mercury::get_build_mercury_job; @@ -81,11 +81,11 @@ pub struct App { #[tracker::do_not_track] config: Config, #[tracker::do_not_track] - xrservice_worker: Option, + xrservice_worker: Option, #[tracker::do_not_track] restart_xrservice: bool, #[tracker::do_not_track] - build_worker: Option, + build_worker: Option, #[tracker::do_not_track] profiles: Vec, #[tracker::do_not_track] @@ -164,12 +164,12 @@ impl App { remove_file(&get_ipc_file_path(&prof.xrservice_type)) .is_err() .then(|| println!("Failed to remove xrservice IPC file")); - let worker = RunnerWorkerWrap::xrservice_worker_wrap_from_profile( + let worker = JobWorker::xrservice_worker_wrap_from_profile( &prof, sender.input_sender(), |msg| match msg { - RunnerWorkerOut::Log(rows) => Msg::OnServiceLog(rows), - RunnerWorkerOut::Exit(code) => Msg::OnServiceExit(code), + JobWorkerOut::Log(rows) => Msg::OnServiceLog(rows), + JobWorkerOut::Exit(code) => Msg::OnServiceExit(code), }, ); worker.start(); @@ -417,9 +417,9 @@ impl SimpleComponent for App { .sender() .send(BuildWindowMsg::Present) .unwrap(); - let worker = RunnerWorkerWrap::new(jobs, sender.input_sender(), |msg| match msg { - RunnerWorkerOut::Log(rows) => Msg::OnBuildLog(rows), - RunnerWorkerOut::Exit(code) => Msg::OnBuildExit(code), + let worker = JobWorker::new(jobs, sender.input_sender(), |msg| match msg { + JobWorkerOut::Log(rows) => Msg::OnBuildLog(rows), + JobWorkerOut::Exit(code) => Msg::OnBuildExit(code), }); worker.start(); self.build_window diff --git a/src/ui/workers/runner_worker.rs b/src/ui/job_worker/internal_worker.rs similarity index 57% rename from src/ui/workers/runner_worker.rs rename to src/ui/job_worker/internal_worker.rs index 790476f..a5ed8fe 100644 --- a/src/ui/workers/runner_worker.rs +++ b/src/ui/job_worker/internal_worker.rs @@ -1,20 +1,18 @@ use crate::{profile::Profile, withclones}; -use nix::{ - sys::signal::{ - kill, - Signal::{SIGKILL, SIGTERM}, - }, - unistd::Pid, + +use super::{ + job::{CmdWorkerData, FuncWorkerOut, WorkerJob}, + state::JobWorkerState, }; -use relm4::{prelude::*, Sender, Worker, WorkerController}; +use nix::unistd::Pid; +use relm4::{prelude::*, Worker}; use std::{ - collections::{HashMap, VecDeque}, + collections::VecDeque, io::{BufRead, BufReader}, mem, process::{Command, Stdio}, sync::{Arc, Mutex}, - thread::{self, sleep}, - time::Duration, + thread, }; macro_rules! logger_thread { @@ -44,72 +42,31 @@ macro_rules! logger_thread { }; } -#[derive(Debug, Clone)] -pub struct CmdWorkerData { - pub environment: HashMap, - pub command: String, - pub args: Vec, -} - -#[derive(Debug, Clone, Default)] -pub struct FuncWorkerOut { - pub success: bool, - pub out: Vec, -} - -pub struct FuncWorkerData { - pub func: Box FuncWorkerOut + Send + Sync + 'static>, -} - -pub enum WorkerJob { - Cmd(CmdWorkerData), - Func(FuncWorkerData), -} - -impl WorkerJob { - pub fn new_cmd(env: Option>, cmd: String, args: Option>) -> Self { - Self::Cmd(CmdWorkerData { environment: env.unwrap_or_default(), command: cmd, args: args.unwrap_or_default() }) - } - - pub fn new_func(func: Box FuncWorkerOut + Send + Sync + 'static>) -> Self { - Self::Func(FuncWorkerData { func }) - } -} - #[derive(Debug)] -pub enum RunnerWorkerOut { +pub enum JobWorkerOut { Log(Vec), Exit(i32), } #[derive(Debug)] -pub enum RunnerWorkerMsg { +pub enum JobWorkerMsg { Start, } -#[derive(Debug, Clone, Default)] -pub struct RunnerWorkerState { - pub current_pid: Option, - pub exit_status: Option, - pub stop_requested: bool, - pub started: bool, - pub exited: bool, -} - -pub struct RunnerWorker { +pub struct InternalJobWorker { jobs: VecDeque, - state: Arc>, + state: Arc>, } -pub struct RunnerWorkerInit { +pub struct JobWorkerInit { pub jobs: VecDeque, - pub state: Arc>, + pub state: Arc>, } -impl Worker for RunnerWorker { - type Init = RunnerWorkerInit; - type Input = RunnerWorkerMsg; - type Output = RunnerWorkerOut; +impl Worker for InternalJobWorker { + type Init = JobWorkerInit; + type Input = JobWorkerMsg; + type Output = JobWorkerOut; fn init(init: Self::Init, _sender: ComponentSender) -> Self { Self { @@ -118,7 +75,7 @@ impl Worker for RunnerWorker { } } - fn update(&mut self, msg: RunnerWorkerMsg, sender: ComponentSender) { + fn update(&mut self, msg: JobWorkerMsg, sender: ComponentSender) { // Send the result of the calculation back match msg { Self::Input::Start => { @@ -183,11 +140,11 @@ impl Worker for RunnerWorker { } } -impl RunnerWorker { +impl InternalJobWorker { pub fn xrservice_worker_from_profile( prof: &Profile, - state: Arc>, - ) -> relm4::WorkerHandle { + state: Arc>, + ) -> relm4::WorkerHandle { let mut env = prof.environment.clone(); if !env.contains_key("LH_DRIVER") { env.insert( @@ -202,70 +159,6 @@ impl RunnerWorker { }; let mut jobs = VecDeque::new(); jobs.push_back(WorkerJob::Cmd(data)); - Self::builder().detach_worker(RunnerWorkerInit { jobs, state }) - } -} - -pub struct RunnerWorkerWrap { - pub worker: WorkerController, - pub state: Arc>, -} - -impl RunnerWorkerWrap { - pub fn new X) + 'static>( - jobs: VecDeque, - sender: &Sender, - transform: F, - ) -> Self { - let state = Arc::new(Mutex::new(RunnerWorkerState::default())); - let init = RunnerWorkerInit { - jobs, - state: state.clone(), - }; - Self { - worker: RunnerWorker::builder() - .detach_worker(init) - .forward(sender, transform), - state, - } - } - - pub fn xrservice_worker_wrap_from_profile< - X: 'static, - F: (Fn(RunnerWorkerOut) -> X) + 'static, - >( - prof: &Profile, - sender: &Sender, - transform: F, - ) -> Self { - let state = Arc::new(Mutex::new(RunnerWorkerState::default())); - Self { - worker: RunnerWorker::xrservice_worker_from_profile(prof, state.clone()) - .forward(sender, transform), - state, - } - } - - pub fn start(&self) { - self.worker.emit(RunnerWorkerMsg::Start); - } - - pub fn stop(&self) { - if self.state.lock().unwrap().started && !self.state.lock().unwrap().exited { - self.state.lock().unwrap().stop_requested = true; - if let Some(pid) = self.state.lock().unwrap().current_pid { - kill(pid, SIGTERM).expect("Could not send sigterm to process"); - let state = self.state.clone(); - thread::spawn(move || { - sleep(Duration::from_secs(2)); - if let Ok(s) = state.lock() { - if s.exited { - // process is still alive - kill(pid, SIGKILL).expect("Failed to kill process"); - } - } - }); - } - } + Self::builder().detach_worker(JobWorkerInit { jobs, state }) } } diff --git a/src/ui/job_worker/job.rs b/src/ui/job_worker/job.rs new file mode 100644 index 0000000..46f266b --- /dev/null +++ b/src/ui/job_worker/job.rs @@ -0,0 +1,41 @@ +use std::collections::HashMap; + +#[derive(Debug, Clone)] +pub struct CmdWorkerData { + pub environment: HashMap, + pub command: String, + pub args: Vec, +} + +#[derive(Debug, Clone, Default)] +pub struct FuncWorkerOut { + pub success: bool, + pub out: Vec, +} + +pub struct FuncWorkerData { + pub func: Box FuncWorkerOut + Send + Sync + 'static>, +} + +pub enum WorkerJob { + Cmd(CmdWorkerData), + Func(FuncWorkerData), +} + +impl WorkerJob { + pub fn new_cmd( + env: Option>, + cmd: String, + args: Option>, + ) -> Self { + Self::Cmd(CmdWorkerData { + environment: env.unwrap_or_default(), + command: cmd, + args: args.unwrap_or_default(), + }) + } + + pub fn new_func(func: Box FuncWorkerOut + Send + Sync + 'static>) -> Self { + Self::Func(FuncWorkerData { func }) + } +} diff --git a/src/ui/job_worker/mod.rs b/src/ui/job_worker/mod.rs new file mode 100644 index 0000000..5419d38 --- /dev/null +++ b/src/ui/job_worker/mod.rs @@ -0,0 +1,82 @@ +use self::{ + internal_worker::{InternalJobWorker, JobWorkerInit, JobWorkerMsg, JobWorkerOut}, + job::WorkerJob, + state::JobWorkerState, +}; +use crate::profile::Profile; +use nix::sys::signal::{ + kill, + Signal::{SIGKILL, SIGTERM}, +}; +use relm4::{prelude::*, Sender, WorkerController}; +use std::{ + collections::VecDeque, + sync::{Arc, Mutex}, + thread::{self, sleep}, + time::Duration, +}; + +pub mod internal_worker; +pub mod job; +pub mod state; + +pub struct JobWorker { + pub worker: WorkerController, + pub state: Arc>, +} + +impl JobWorker { + pub fn new X) + 'static>( + jobs: VecDeque, + sender: &Sender, + transform: F, + ) -> Self { + let state = Arc::new(Mutex::new(JobWorkerState::default())); + let init = JobWorkerInit { + jobs, + state: state.clone(), + }; + Self { + worker: InternalJobWorker::builder() + .detach_worker(init) + .forward(sender, transform), + state, + } + } + + pub fn xrservice_worker_wrap_from_profile X) + 'static>( + prof: &Profile, + sender: &Sender, + transform: F, + ) -> Self { + let state = Arc::new(Mutex::new(JobWorkerState::default())); + Self { + worker: InternalJobWorker::xrservice_worker_from_profile(prof, state.clone()) + .forward(sender, transform), + state, + } + } + + pub fn start(&self) { + self.worker.emit(JobWorkerMsg::Start); + } + + pub fn stop(&self) { + if self.state.lock().unwrap().started && !self.state.lock().unwrap().exited { + self.state.lock().unwrap().stop_requested = true; + if let Some(pid) = self.state.lock().unwrap().current_pid { + kill(pid, SIGTERM).expect("Could not send sigterm to process"); + let state = self.state.clone(); + thread::spawn(move || { + sleep(Duration::from_secs(2)); + if let Ok(s) = state.lock() { + if s.exited { + // process is still alive + kill(pid, SIGKILL).expect("Failed to kill process"); + } + } + }); + } + } + } +} diff --git a/src/ui/job_worker/state.rs b/src/ui/job_worker/state.rs new file mode 100644 index 0000000..7621dab --- /dev/null +++ b/src/ui/job_worker/state.rs @@ -0,0 +1,10 @@ +use nix::unistd::Pid; + +#[derive(Debug, Clone, Default)] +pub struct JobWorkerState { + pub current_pid: Option, + pub exit_status: Option, + pub stop_requested: bool, + pub started: bool, + pub exited: bool, +} diff --git a/src/ui/mod.rs b/src/ui/mod.rs index 4df90fa..973ca96 100644 --- a/src/ui/mod.rs +++ b/src/ui/mod.rs @@ -7,6 +7,7 @@ pub mod devices_box; pub mod factories; pub mod fbt_config_editor; pub mod install_wivrn_box; +pub mod job_worker; pub mod libsurvive_setup_window; pub mod macros; pub mod main_view; @@ -15,4 +16,3 @@ pub mod profile_editor; pub mod steam_launch_options_box; pub mod util; pub mod wivrn_conf_editor; -pub mod workers; diff --git a/src/ui/workers/mod.rs b/src/ui/workers/mod.rs deleted file mode 100644 index 81ceff5..0000000 --- a/src/ui/workers/mod.rs +++ /dev/null @@ -1 +0,0 @@ -pub mod runner_worker;