refactor: promote Id to the task scheduler (#2873)

This commit is contained in:
三咲雅 misaki masa 2025-06-14 12:07:22 +08:00 committed by GitHub
parent 0eec8fc80e
commit aae3f9ea4a
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
20 changed files with 179 additions and 107 deletions

146
Cargo.lock generated
View file

@ -213,7 +213,7 @@ dependencies = [
"miniz_oxide", "miniz_oxide",
"object", "object",
"rustc-demangle", "rustc-demangle",
"windows-targets", "windows-targets 0.52.6",
] ]
[[package]] [[package]]
@ -349,9 +349,9 @@ dependencies = [
[[package]] [[package]]
name = "cc" name = "cc"
version = "1.2.26" version = "1.2.27"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "956a5e21988b87f372569b66183b78babf23ebc2e744b733e4350a752c4dafac" checksum = "d487aa071b5f64da6f19a3e848e3578944b726ee5a4854b82172f02aa876bfdc"
dependencies = [ dependencies = [
"jobserver", "jobserver",
"libc", "libc",
@ -735,7 +735,7 @@ dependencies = [
"libc", "libc",
"option-ext", "option-ext",
"redox_users", "redox_users",
"windows-sys 0.59.0", "windows-sys 0.60.2",
] ]
[[package]] [[package]]
@ -1442,9 +1442,9 @@ dependencies = [
[[package]] [[package]]
name = "memchr" name = "memchr"
version = "2.7.4" version = "2.7.5"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "78ca9ab1a0babb1e7d5695e3530886289c18cf2f87ec19a575a0abdce112e3a3" checksum = "32a282da65faaf38286cf3be983213fcf1d2e2a58700e808f83f4ea9a4804bc0"
[[package]] [[package]]
name = "minimal-lexical" name = "minimal-lexical"
@ -1810,7 +1810,7 @@ dependencies = [
"libc", "libc",
"redox_syscall", "redox_syscall",
"smallvec", "smallvec",
"windows-targets", "windows-targets 0.52.6",
] ]
[[package]] [[package]]
@ -1845,9 +1845,9 @@ checksum = "7edddbd0b52d732b21ad9a5fab5c704c14cd949e5e9a1ec5929a24fded1b904c"
[[package]] [[package]]
name = "plist" name = "plist"
version = "1.7.1" version = "1.7.2"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "eac26e981c03a6e53e0aee43c113e3202f5581d5360dae7bd2c70e800dd0451d" checksum = "3d77244ce2d584cd84f6a15f86195b8c9b2a0dfbfd817c09e0464244091a58ed"
dependencies = [ dependencies = [
"base64", "base64",
"indexmap", "indexmap",
@ -1964,9 +1964,9 @@ checksum = "a993555f31e5a609f617c12db6250dedcac1b0a85076912c436e6fc9b2c8e6a3"
[[package]] [[package]]
name = "quick-xml" name = "quick-xml"
version = "0.32.0" version = "0.37.5"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "1d3a6e5838b60e0e8fa7a43f22ade549a37d61f8bdbe636d0d7816191de969c2" checksum = "331e97a1af0bf59823e6eadffe373d7b27f485be8748f71471c662c1f269b7fb"
dependencies = [ dependencies = [
"memchr", "memchr",
] ]
@ -2133,9 +2133,9 @@ dependencies = [
[[package]] [[package]]
name = "redox_syscall" name = "redox_syscall"
version = "0.5.12" version = "0.5.13"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "928fca9cf2aa042393a8325b9ead81d2f0df4cb12e1e24cef072922ccd99c5af" checksum = "0d04b7d0ee6b4a0207a0a7adb104d23ecb0b47d6beae7152d0fa34b692b29fd6"
dependencies = [ dependencies = [
"bitflags 2.9.1", "bitflags 2.9.1",
] ]
@ -2486,9 +2486,9 @@ dependencies = [
[[package]] [[package]]
name = "syn" name = "syn"
version = "2.0.102" version = "2.0.103"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "f6397daf94fa90f058bd0fd88429dd9e5738999cca8d701813c80723add80462" checksum = "e4307e30089d6fd6aff212f2da3a1f9e32f3223b1f010fb09b7c95f90f3ca1e8"
dependencies = [ dependencies = [
"proc-macro2", "proc-macro2",
"quote", "quote",
@ -2594,12 +2594,11 @@ dependencies = [
[[package]] [[package]]
name = "thread_local" name = "thread_local"
version = "1.1.8" version = "1.1.9"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "8b9ef9bad013ada3808854ceac7b46812a6465ba368859a37e2100283d2d719c" checksum = "f60246a4944f24f6e018aa17cdeffb7818b76356965d03b07d6a9886e8962185"
dependencies = [ dependencies = [
"cfg-if", "cfg-if",
"once_cell",
] ]
[[package]] [[package]]
@ -3129,7 +3128,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "1de69df01bdf1ead2f4ac895dc77c9351aefff65b2f3db429a343f9cbf05e132" checksum = "1de69df01bdf1ead2f4ac895dc77c9351aefff65b2f3db429a343f9cbf05e132"
dependencies = [ dependencies = [
"windows-core 0.56.0", "windows-core 0.56.0",
"windows-targets", "windows-targets 0.52.6",
] ]
[[package]] [[package]]
@ -3141,7 +3140,7 @@ dependencies = [
"windows-implement 0.56.0", "windows-implement 0.56.0",
"windows-interface 0.56.0", "windows-interface 0.56.0",
"windows-result 0.1.2", "windows-result 0.1.2",
"windows-targets", "windows-targets 0.52.6",
] ]
[[package]] [[package]]
@ -3203,9 +3202,9 @@ dependencies = [
[[package]] [[package]]
name = "windows-link" name = "windows-link"
version = "0.1.1" version = "0.1.3"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "76840935b766e1b0a05c0066835fb9ec80071d4c09a16f6bd5f7e655e3c14c38" checksum = "5e6ad25900d524eaabdbbb96d20b4311e1e7ae1699af4fb28c17ae66c80d798a"
[[package]] [[package]]
name = "windows-result" name = "windows-result"
@ -3213,7 +3212,7 @@ version = "0.1.2"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "5e383302e8ec8515204254685643de10811af0ed97ea37210dc26fb0032647f8" checksum = "5e383302e8ec8515204254685643de10811af0ed97ea37210dc26fb0032647f8"
dependencies = [ dependencies = [
"windows-targets", "windows-targets 0.52.6",
] ]
[[package]] [[package]]
@ -3240,7 +3239,7 @@ version = "0.52.0"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d" checksum = "282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d"
dependencies = [ dependencies = [
"windows-targets", "windows-targets 0.52.6",
] ]
[[package]] [[package]]
@ -3249,7 +3248,16 @@ version = "0.59.0"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "1e38bc4d79ed67fd075bcc251a1c39b32a1776bbe92e5bef1f0bf1f8c531853b" checksum = "1e38bc4d79ed67fd075bcc251a1c39b32a1776bbe92e5bef1f0bf1f8c531853b"
dependencies = [ dependencies = [
"windows-targets", "windows-targets 0.52.6",
]
[[package]]
name = "windows-sys"
version = "0.60.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "f2f500e4d28234f72040990ec9d39e3a6b950f9f22d3dba18416c35882612bcb"
dependencies = [
"windows-targets 0.53.2",
] ]
[[package]] [[package]]
@ -3258,14 +3266,30 @@ version = "0.52.6"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "9b724f72796e036ab90c1021d4780d4d3d648aca59e491e6b98e725b84e99973" checksum = "9b724f72796e036ab90c1021d4780d4d3d648aca59e491e6b98e725b84e99973"
dependencies = [ dependencies = [
"windows_aarch64_gnullvm", "windows_aarch64_gnullvm 0.52.6",
"windows_aarch64_msvc", "windows_aarch64_msvc 0.52.6",
"windows_i686_gnu", "windows_i686_gnu 0.52.6",
"windows_i686_gnullvm", "windows_i686_gnullvm 0.52.6",
"windows_i686_msvc", "windows_i686_msvc 0.52.6",
"windows_x86_64_gnu", "windows_x86_64_gnu 0.52.6",
"windows_x86_64_gnullvm", "windows_x86_64_gnullvm 0.52.6",
"windows_x86_64_msvc", "windows_x86_64_msvc 0.52.6",
]
[[package]]
name = "windows-targets"
version = "0.53.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "c66f69fcc9ce11da9966ddb31a40968cad001c5bedeb5c2b82ede4253ab48aef"
dependencies = [
"windows_aarch64_gnullvm 0.53.0",
"windows_aarch64_msvc 0.53.0",
"windows_i686_gnu 0.53.0",
"windows_i686_gnullvm 0.53.0",
"windows_i686_msvc 0.53.0",
"windows_x86_64_gnu 0.53.0",
"windows_x86_64_gnullvm 0.53.0",
"windows_x86_64_msvc 0.53.0",
] ]
[[package]] [[package]]
@ -3274,48 +3298,96 @@ version = "0.52.6"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3" checksum = "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3"
[[package]]
name = "windows_aarch64_gnullvm"
version = "0.53.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "86b8d5f90ddd19cb4a147a5fa63ca848db3df085e25fee3cc10b39b6eebae764"
[[package]] [[package]]
name = "windows_aarch64_msvc" name = "windows_aarch64_msvc"
version = "0.52.6" version = "0.52.6"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469" checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469"
[[package]]
name = "windows_aarch64_msvc"
version = "0.53.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "c7651a1f62a11b8cbd5e0d42526e55f2c99886c77e007179efff86c2b137e66c"
[[package]] [[package]]
name = "windows_i686_gnu" name = "windows_i686_gnu"
version = "0.52.6" version = "0.52.6"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "8e9b5ad5ab802e97eb8e295ac6720e509ee4c243f69d781394014ebfe8bbfa0b" checksum = "8e9b5ad5ab802e97eb8e295ac6720e509ee4c243f69d781394014ebfe8bbfa0b"
[[package]]
name = "windows_i686_gnu"
version = "0.53.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "c1dc67659d35f387f5f6c479dc4e28f1d4bb90ddd1a5d3da2e5d97b42d6272c3"
[[package]] [[package]]
name = "windows_i686_gnullvm" name = "windows_i686_gnullvm"
version = "0.52.6" version = "0.52.6"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66" checksum = "0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66"
[[package]]
name = "windows_i686_gnullvm"
version = "0.53.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "9ce6ccbdedbf6d6354471319e781c0dfef054c81fbc7cf83f338a4296c0cae11"
[[package]] [[package]]
name = "windows_i686_msvc" name = "windows_i686_msvc"
version = "0.52.6" version = "0.52.6"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66" checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66"
[[package]]
name = "windows_i686_msvc"
version = "0.53.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "581fee95406bb13382d2f65cd4a908ca7b1e4c2f1917f143ba16efe98a589b5d"
[[package]] [[package]]
name = "windows_x86_64_gnu" name = "windows_x86_64_gnu"
version = "0.52.6" version = "0.52.6"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78" checksum = "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78"
[[package]]
name = "windows_x86_64_gnu"
version = "0.53.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "2e55b5ac9ea33f2fc1716d1742db15574fd6fc8dadc51caab1c16a3d3b4190ba"
[[package]] [[package]]
name = "windows_x86_64_gnullvm" name = "windows_x86_64_gnullvm"
version = "0.52.6" version = "0.52.6"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d" checksum = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d"
[[package]]
name = "windows_x86_64_gnullvm"
version = "0.53.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "0a6e035dd0599267ce1ee132e51c27dd29437f63325753051e71dd9e42406c57"
[[package]] [[package]]
name = "windows_x86_64_msvc" name = "windows_x86_64_msvc"
version = "0.52.6" version = "0.52.6"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec"
[[package]]
name = "windows_x86_64_msvc"
version = "0.53.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "271414315aff87387382ec3d271b52d7ae78726f5d44ac98b4f4030c91880486"
[[package]] [[package]]
name = "winnow" name = "winnow"
version = "0.7.11" version = "0.7.11"
@ -3583,7 +3655,7 @@ dependencies = [
"tokio", "tokio",
"tracing", "tracing",
"uzers", "uzers",
"windows-sys 0.59.0", "windows-sys 0.60.2",
"yazi-ffi", "yazi-ffi",
"yazi-macro", "yazi-macro",
"yazi-shared", "yazi-shared",
@ -3618,7 +3690,7 @@ dependencies = [
"twox-hash", "twox-hash",
"unicode-width 0.2.0", "unicode-width 0.2.0",
"uzers", "uzers",
"windows-sys 0.59.0", "windows-sys 0.60.2",
"yazi-adapter", "yazi-adapter",
"yazi-binding", "yazi-binding",
"yazi-boot", "yazi-boot",
@ -3690,7 +3762,7 @@ dependencies = [
"tokio", "tokio",
"tracing", "tracing",
"uzers", "uzers",
"windows-sys 0.59.0", "windows-sys 0.60.2",
"yazi-macro", "yazi-macro",
] ]
@ -3702,7 +3774,7 @@ dependencies = [
"libc", "libc",
"parking_lot", "parking_lot",
"tracing", "tracing",
"windows-sys 0.59.0", "windows-sys 0.60.2",
"yazi-macro", "yazi-macro",
"yazi-shared", "yazi-shared",
] ]

View file

@ -13,5 +13,5 @@ proc-macro = true
[dependencies] [dependencies]
# External dependencies # External dependencies
syn = { version = "2.0.102", features = [ "full" ] } syn = { version = "2.0.103", features = [ "full" ] }
quote = "1.0.40" quote = "1.0.40"

View file

@ -55,7 +55,7 @@ impl App {
drain_events!(); drain_events!();
} }
} }
} else if rx.recv_many(&mut events, 50).await > 0 { } else if rx.recv_many(&mut events, 50).await != 0 {
drain_events!(); drain_events!();
} else { } else {
break; break;

View file

@ -32,7 +32,7 @@ libc = { workspace = true }
uzers = { workspace = true } uzers = { workspace = true }
[target.'cfg(windows)'.dependencies] [target.'cfg(windows)'.dependencies]
windows-sys = { version = "0.59.0", features = [ "Win32_Storage_FileSystem" ] } windows-sys = { version = "0.60.2", features = [ "Win32_Storage_FileSystem" ] }
[target.'cfg(target_os = "macos")'.dependencies] [target.'cfg(target_os = "macos")'.dependencies]
core-foundation-sys = { workspace = true } core-foundation-sys = { workspace = true }

View file

@ -12,10 +12,7 @@ use yazi_shared::natsort;
use super::{Locked, Partition, Partitions}; use super::{Locked, Partition, Partitions};
impl Partitions { impl Partitions {
pub fn monitor<F>(me: Locked, cb: F) pub fn monitor(me: Locked, cb: fn()) {
where
F: Fn() + Copy + Send + 'static,
{
tokio::task::spawn_blocking(move || { tokio::task::spawn_blocking(move || {
let session = unsafe { DASessionCreate(kCFAllocatorDefault) }; let session = unsafe { DASessionCreate(kCFAllocatorDefault) };
if session.is_null() { if session.is_null() {

View file

@ -51,7 +51,7 @@ uzers = { workspace = true }
[target."cfg(windows)".dependencies] [target."cfg(windows)".dependencies]
clipboard-win = "5.4.0" clipboard-win = "5.4.0"
windows-sys = { version = "0.59.0", features = [ "Win32_System_JobObjects" ] } windows-sys = { version = "0.60.2", features = [ "Win32_System_JobObjects" ] }
[target.'cfg(target_os = "macos")'.dependencies] [target.'cfg(target_os = "macos")'.dependencies]
crossterm = { workspace = true, features = [ "use-dev-tty", "libc" ] } crossterm = { workspace = true, features = [ "use-dev-tty", "libc" ] }

View file

@ -5,7 +5,7 @@ use tokio::{fs::{self, DirEntry}, io::{self, ErrorKind::{AlreadyExists, NotFound
use tracing::warn; use tracing::warn;
use yazi_config::YAZI; use yazi_config::YAZI;
use yazi_fs::{SizeCalculator, cha::Cha, copy_with_progress, maybe_exists, ok_or_not_found, path_relative_to, skip_path}; use yazi_fs::{SizeCalculator, cha::Cha, copy_with_progress, maybe_exists, ok_or_not_found, path_relative_to, skip_path};
use yazi_shared::url::Url; use yazi_shared::{Id, url::Url};
use super::{FileIn, FileInDelete, FileInHardlink, FileInLink, FileInPaste, FileInTrash}; use super::{FileIn, FileInDelete, FileInHardlink, FileInLink, FileInPaste, FileInTrash};
use crate::{LOW, NORMAL, TaskOp, TaskProg}; use crate::{LOW, NORMAL, TaskOp, TaskProg};
@ -343,17 +343,15 @@ impl File {
impl File { impl File {
#[inline] #[inline]
fn succ(&self, id: usize) -> Result<()> { Ok(self.prog.send(TaskProg::Succ(id))?) } fn succ(&self, id: Id) -> Result<()> { Ok(self.prog.send(TaskProg::Succ(id))?) }
#[inline] #[inline]
fn fail(&self, id: usize, reason: String) -> Result<()> { fn fail(&self, id: Id, reason: String) -> Result<()> {
Ok(self.prog.send(TaskProg::Fail(id, reason))?) Ok(self.prog.send(TaskProg::Fail(id, reason))?)
} }
#[inline] #[inline]
fn log(&self, id: usize, line: String) -> Result<()> { fn log(&self, id: Id, line: String) -> Result<()> { Ok(self.prog.send(TaskProg::Log(id, line))?) }
Ok(self.prog.send(TaskProg::Log(id, line))?)
}
#[inline] #[inline]
async fn queue(&self, r#in: impl Into<TaskOp>, priority: u8) -> Result<()> { async fn queue(&self, r#in: impl Into<TaskOp>, priority: u8) -> Result<()> {

View file

@ -1,5 +1,5 @@
use yazi_fs::cha::Cha; use yazi_fs::cha::Cha;
use yazi_shared::url::Url; use yazi_shared::{Id, url::Url};
#[derive(Debug)] #[derive(Debug)]
pub enum FileIn { pub enum FileIn {
@ -11,7 +11,7 @@ pub enum FileIn {
} }
impl FileIn { impl FileIn {
pub fn id(&self) -> usize { pub fn id(&self) -> Id {
match self { match self {
Self::Paste(r#in) => r#in.id, Self::Paste(r#in) => r#in.id,
Self::Link(r#in) => r#in.id, Self::Link(r#in) => r#in.id,
@ -25,7 +25,7 @@ impl FileIn {
// --- Paste // --- Paste
#[derive(Clone, Debug)] #[derive(Clone, Debug)]
pub struct FileInPaste { pub struct FileInPaste {
pub id: usize, pub id: Id,
pub from: Url, pub from: Url,
pub to: Url, pub to: Url,
pub cha: Option<Cha>, pub cha: Option<Cha>,
@ -51,7 +51,7 @@ impl FileInPaste {
// --- Link // --- Link
#[derive(Clone, Debug)] #[derive(Clone, Debug)]
pub struct FileInLink { pub struct FileInLink {
pub id: usize, pub id: Id,
pub from: Url, pub from: Url,
pub to: Url, pub to: Url,
pub cha: Option<Cha>, pub cha: Option<Cha>,
@ -77,7 +77,7 @@ impl From<FileInPaste> for FileInLink {
// --- Hardlink // --- Hardlink
#[derive(Clone, Debug)] #[derive(Clone, Debug)]
pub struct FileInHardlink { pub struct FileInHardlink {
pub id: usize, pub id: Id,
pub from: Url, pub from: Url,
pub to: Url, pub to: Url,
pub cha: Option<Cha>, pub cha: Option<Cha>,
@ -93,7 +93,7 @@ impl FileInHardlink {
// --- Delete // --- Delete
#[derive(Clone, Debug)] #[derive(Clone, Debug)]
pub struct FileInDelete { pub struct FileInDelete {
pub id: usize, pub id: Id,
pub target: Url, pub target: Url,
pub length: u64, pub length: u64,
} }
@ -101,7 +101,7 @@ pub struct FileInDelete {
// --- Trash // --- Trash
#[derive(Clone, Debug)] #[derive(Clone, Debug)]
pub struct FileInTrash { pub struct FileInTrash {
pub id: usize, pub id: Id,
pub target: Url, pub target: Url,
pub length: u64, pub length: u64,
} }

View file

@ -1,3 +1,5 @@
use yazi_shared::Id;
use crate::{file::FileIn, plugin::PluginIn, prework::PreworkIn}; use crate::{file::FileIn, plugin::PluginIn, prework::PreworkIn};
#[derive(Debug)] #[derive(Debug)]
@ -8,7 +10,7 @@ pub enum TaskOp {
} }
impl TaskOp { impl TaskOp {
pub fn id(&self) -> usize { pub fn id(&self) -> Id {
match self { match self {
TaskOp::File(r#in) => r#in.id(), TaskOp::File(r#in) => r#in.id(),
TaskOp::Plugin(r#in) => r#in.id(), TaskOp::Plugin(r#in) => r#in.id(),

View file

@ -2,33 +2,34 @@ use std::collections::HashMap;
use futures::future::BoxFuture; use futures::future::BoxFuture;
use yazi_config::YAZI; use yazi_config::YAZI;
use yazi_shared::{Id, Ids};
use super::{Task, TaskStage}; use super::{Task, TaskStage};
use crate::TaskKind; use crate::TaskKind;
#[derive(Default)] #[derive(Default)]
pub struct Ongoing { pub struct Ongoing {
incr: usize, pub(super) hooks: HashMap<Id, Box<dyn (FnOnce(bool) -> BoxFuture<'static, ()>) + Send + Sync>>,
pub(super) all: HashMap<Id, Task>,
pub(super) hooks: HashMap<usize, Box<dyn (FnOnce(bool) -> BoxFuture<'static, ()>) + Send + Sync>>,
pub(super) all: HashMap<usize, Task>,
} }
impl Ongoing { impl Ongoing {
pub fn add(&mut self, kind: TaskKind, name: String) -> usize { pub fn add(&mut self, kind: TaskKind, name: String) -> Id {
self.incr += 1; static IDS: Ids = Ids::new();
self.all.insert(self.incr, Task::new(self.incr, kind, name));
self.incr let id = IDS.next();
self.all.insert(id, Task::new(id, kind, name));
id
} }
#[inline] #[inline]
pub fn get(&self, id: usize) -> Option<&Task> { self.all.get(&id) } pub fn get(&self, id: Id) -> Option<&Task> { self.all.get(&id) }
#[inline] #[inline]
pub fn get_mut(&mut self, id: usize) -> Option<&mut Task> { self.all.get_mut(&id) } pub fn get_mut(&mut self, id: Id) -> Option<&mut Task> { self.all.get_mut(&id) }
#[inline] #[inline]
pub fn get_id(&self, idx: usize) -> Option<usize> { self.values().nth(idx).map(|t| t.id) } pub fn get_id(&self, idx: usize) -> Option<Id> { self.values().nth(idx).map(|t| t.id) }
#[inline] #[inline]
pub fn len(&self) -> usize { pub fn len(&self) -> usize {
@ -40,7 +41,7 @@ impl Ongoing {
} }
#[inline] #[inline]
pub fn exists(&self, id: usize) -> bool { self.all.contains_key(&id) } pub fn exists(&self, id: Id) -> bool { self.all.contains_key(&id) }
#[inline] #[inline]
pub fn values(&self) -> Box<dyn Iterator<Item = &Task> + '_> { pub fn values(&self) -> Box<dyn Iterator<Item = &Task> + '_> {
@ -54,7 +55,7 @@ impl Ongoing {
#[inline] #[inline]
pub fn is_empty(&self) -> bool { self.len() == 0 } pub fn is_empty(&self) -> bool { self.len() == 0 }
pub fn try_remove(&mut self, id: usize, stage: TaskStage) -> Option<BoxFuture<'static, ()>> { pub fn try_remove(&mut self, id: Id, stage: TaskStage) -> Option<BoxFuture<'static, ()>> {
if let Some(task) = self.get_mut(id) { if let Some(task) = self.get_mut(id) {
if stage > task.stage { if stage > task.stage {
task.stage = stage; task.stage = stage;

View file

@ -1,4 +1,5 @@
use yazi_proxy::options::PluginOpt; use yazi_proxy::options::PluginOpt;
use yazi_shared::Id;
#[derive(Debug)] #[derive(Debug)]
pub enum PluginIn { pub enum PluginIn {
@ -6,7 +7,7 @@ pub enum PluginIn {
} }
impl PluginIn { impl PluginIn {
pub fn id(&self) -> usize { pub fn id(&self) -> Id {
match self { match self {
Self::Entry(r#in) => r#in.id, Self::Entry(r#in) => r#in.id,
} }
@ -15,6 +16,6 @@ impl PluginIn {
#[derive(Debug)] #[derive(Debug)]
pub struct PluginInEntry { pub struct PluginInEntry {
pub id: usize, pub id: Id,
pub opt: PluginOpt, pub opt: PluginOpt,
} }

View file

@ -1,6 +1,7 @@
use anyhow::{Result, anyhow}; use anyhow::{Result, anyhow};
use tokio::sync::mpsc; use tokio::sync::mpsc;
use yazi_plugin::isolate; use yazi_plugin::isolate;
use yazi_shared::Id;
use super::{PluginIn, PluginInEntry}; use super::{PluginIn, PluginInEntry};
use crate::{HIGH, TaskOp, TaskProg}; use crate::{HIGH, TaskOp, TaskProg};
@ -50,10 +51,10 @@ impl Plugin {
impl Plugin { impl Plugin {
#[inline] #[inline]
fn succ(&self, id: usize) -> Result<()> { Ok(self.prog.send(TaskProg::Succ(id))?) } fn succ(&self, id: Id) -> Result<()> { Ok(self.prog.send(TaskProg::Succ(id))?) }
#[inline] #[inline]
fn fail(&self, id: usize, reason: String) -> Result<()> { fn fail(&self, id: Id, reason: String) -> Result<()> {
Ok(self.prog.send(TaskProg::Fail(id, reason))?) Ok(self.prog.send(TaskProg::Fail(id, reason))?)
} }

View file

@ -1,7 +1,7 @@
use std::sync::Arc; use std::sync::Arc;
use yazi_config::plugin::{Fetcher, Preloader}; use yazi_config::plugin::{Fetcher, Preloader};
use yazi_shared::{Throttle, url::Url}; use yazi_shared::{Id, Throttle, url::Url};
#[derive(Debug)] #[derive(Debug)]
pub enum PreworkIn { pub enum PreworkIn {
@ -11,7 +11,7 @@ pub enum PreworkIn {
} }
impl PreworkIn { impl PreworkIn {
pub fn id(&self) -> usize { pub fn id(&self) -> Id {
match self { match self {
Self::Fetch(r#in) => r#in.id, Self::Fetch(r#in) => r#in.id,
Self::Load(r#in) => r#in.id, Self::Load(r#in) => r#in.id,
@ -22,21 +22,21 @@ impl PreworkIn {
#[derive(Debug)] #[derive(Debug)]
pub struct PreworkInFetch { pub struct PreworkInFetch {
pub id: usize, pub id: Id,
pub plugin: &'static Fetcher, pub plugin: &'static Fetcher,
pub targets: Vec<yazi_fs::File>, pub targets: Vec<yazi_fs::File>,
} }
#[derive(Clone, Debug)] #[derive(Clone, Debug)]
pub struct PreworkInLoad { pub struct PreworkInLoad {
pub id: usize, pub id: Id,
pub plugin: &'static Preloader, pub plugin: &'static Preloader,
pub target: yazi_fs::File, pub target: yazi_fs::File,
} }
#[derive(Debug)] #[derive(Debug)]
pub struct PreworkInSize { pub struct PreworkInSize {
pub id: usize, pub id: Id,
pub target: Url, pub target: Url,
pub throttle: Arc<Throttle<(Url, u64)>>, pub throttle: Arc<Throttle<(Url, u64)>>,
} }

View file

@ -8,7 +8,7 @@ use tracing::error;
use yazi_config::Priority; use yazi_config::Priority;
use yazi_fs::{FilesOp, SizeCalculator}; use yazi_fs::{FilesOp, SizeCalculator};
use yazi_plugin::isolate; use yazi_plugin::isolate;
use yazi_shared::{event::CmdCow, url::Url}; use yazi_shared::{Id, event::CmdCow, url::Url};
use super::{PreworkIn, PreworkInFetch, PreworkInLoad, PreworkInSize}; use super::{PreworkIn, PreworkInFetch, PreworkInLoad, PreworkInSize};
use crate::{HIGH, NORMAL, TaskOp, TaskProg}; use crate::{HIGH, NORMAL, TaskOp, TaskProg};
@ -130,10 +130,10 @@ impl Prework {
impl Prework { impl Prework {
#[inline] #[inline]
fn succ(&self, id: usize) -> Result<()> { Ok(self.prog.send(TaskProg::Succ(id))?) } fn succ(&self, id: Id) -> Result<()> { Ok(self.prog.send(TaskProg::Succ(id))?) }
#[inline] #[inline]
fn fail(&self, id: usize, reason: String) -> Result<()> { fn fail(&self, id: Id, reason: String) -> Result<()> {
Ok(self.prog.send(TaskProg::Fail(id, reason))?) Ok(self.prog.send(TaskProg::Fail(id, reason))?)
} }

View file

@ -1,14 +1,14 @@
use std::ffi::OsString; use std::ffi::OsString;
use tokio::sync::mpsc; use tokio::sync::mpsc;
use yazi_shared::url::Url; use yazi_shared::{Id, url::Url};
use super::ShellOpt; use super::ShellOpt;
// --- Block // --- Block
#[derive(Debug)] #[derive(Debug)]
pub struct ProcessInBlock { pub struct ProcessInBlock {
pub id: usize, pub id: Id,
pub cwd: Url, pub cwd: Url,
pub cmd: OsString, pub cmd: OsString,
pub args: Vec<OsString>, pub args: Vec<OsString>,
@ -23,7 +23,7 @@ impl From<ProcessInBlock> for ShellOpt {
// --- Orphan // --- Orphan
#[derive(Debug)] #[derive(Debug)]
pub struct ProcessInOrphan { pub struct ProcessInOrphan {
pub id: usize, pub id: Id,
pub cwd: Url, pub cwd: Url,
pub cmd: OsString, pub cmd: OsString,
pub args: Vec<OsString>, pub args: Vec<OsString>,
@ -38,7 +38,7 @@ impl From<ProcessInOrphan> for ShellOpt {
// --- Bg // --- Bg
#[derive(Debug)] #[derive(Debug)]
pub struct ProcessInBg { pub struct ProcessInBg {
pub id: usize, pub id: Id,
pub cwd: Url, pub cwd: Url,
pub cmd: OsString, pub cmd: OsString,
pub args: Vec<OsString>, pub args: Vec<OsString>,

View file

@ -2,6 +2,7 @@ use anyhow::Result;
use scopeguard::defer; use scopeguard::defer;
use tokio::{io::{AsyncBufReadExt, BufReader}, select, sync::mpsc}; use tokio::{io::{AsyncBufReadExt, BufReader}, select, sync::mpsc};
use yazi_proxy::{AppProxy, HIDER}; use yazi_proxy::{AppProxy, HIDER};
use yazi_shared::Id;
use super::{ProcessInBg, ProcessInBlock, ProcessInOrphan, ShellOpt}; use super::{ProcessInBg, ProcessInBlock, ProcessInOrphan, ShellOpt};
use crate::TaskProg; use crate::TaskProg;
@ -97,15 +98,13 @@ impl Process {
impl Process { impl Process {
#[inline] #[inline]
fn succ(&self, id: usize) -> Result<()> { Ok(self.prog.send(TaskProg::Succ(id))?) } fn succ(&self, id: Id) -> Result<()> { Ok(self.prog.send(TaskProg::Succ(id))?) }
#[inline] #[inline]
fn fail(&self, id: usize, reason: String) -> Result<()> { fn fail(&self, id: Id, reason: String) -> Result<()> {
Ok(self.prog.send(TaskProg::Fail(id, reason))?) Ok(self.prog.send(TaskProg::Fail(id, reason))?)
} }
#[inline] #[inline]
fn log(&self, id: usize, line: String) -> Result<()> { fn log(&self, id: Id, line: String) -> Result<()> { Ok(self.prog.send(TaskProg::Log(id, line))?) }
Ok(self.prog.send(TaskProg::Log(id, line))?)
}
} }

View file

@ -8,7 +8,7 @@ use yazi_config::{YAZI, plugin::{Fetcher, Preloader}};
use yazi_dds::Pump; use yazi_dds::Pump;
use yazi_fs::{must_be_dir, remove_dir_clean, unique_name}; use yazi_fs::{must_be_dir, remove_dir_clean, unique_name};
use yazi_proxy::{MgrProxy, options::{PluginOpt, ProcessExecOpt}}; use yazi_proxy::{MgrProxy, options::{PluginOpt, ProcessExecOpt}};
use yazi_shared::{Throttle, url::Url}; use yazi_shared::{Id, Throttle, url::Url};
use super::{Ongoing, TaskProg, TaskStage}; use super::{Ongoing, TaskProg, TaskStage};
use crate::{HIGH, LOW, NORMAL, TaskKind, TaskOp, file::{File, FileInDelete, FileInHardlink, FileInLink, FileInPaste, FileInTrash}, plugin::{Plugin, PluginInEntry}, prework::{Prework, PreworkInFetch, PreworkInLoad, PreworkInSize}, process::{Process, ProcessInBg, ProcessInBlock, ProcessInOrphan}}; use crate::{HIGH, LOW, NORMAL, TaskKind, TaskOp, file::{File, FileInDelete, FileInHardlink, FileInLink, FileInPaste, FileInTrash}, plugin::{Plugin, PluginInEntry}, prework::{Prework, PreworkInFetch, PreworkInLoad, PreworkInSize}, process::{Process, ProcessInBg, ProcessInBlock, ProcessInOrphan}};
@ -55,7 +55,7 @@ impl Scheduler {
scheduler scheduler
} }
pub fn cancel(&self, id: usize) -> bool { pub fn cancel(&self, id: Id) -> bool {
let mut ongoing = self.ongoing.lock(); let mut ongoing = self.ongoing.lock();
if let Some(hook) = ongoing.hooks.remove(&id) { if let Some(hook) = ongoing.hooks.remove(&id) {
@ -413,7 +413,7 @@ impl Scheduler {
}) })
} }
fn send_micro<F>(&self, id: usize, priority: u8, f: F) fn send_micro<F>(&self, id: Id, priority: u8, f: F)
where where
F: Future<Output = Result<()>> + Send + 'static, F: Future<Output = Result<()>> + Send + 'static,
{ {
@ -430,7 +430,7 @@ impl Scheduler {
); );
} }
fn new_and_fail(&self, id: usize, reason: &str) -> Result<()> { fn new_and_fail(&self, id: Id, reason: &str) -> Result<()> {
self.prog.send(TaskProg::New(id, 0))?; self.prog.send(TaskProg::New(id, 0))?;
self.prog.send(TaskProg::Fail(id, reason.to_owned()))?; self.prog.send(TaskProg::Fail(id, reason.to_owned()))?;
Ok(()) Ok(())

View file

@ -1,8 +1,9 @@
use tokio::sync::mpsc; use tokio::sync::mpsc;
use yazi_shared::Id;
#[derive(Debug, Default)] #[derive(Debug, Default)]
pub struct Task { pub struct Task {
pub id: usize, pub id: Id,
pub kind: TaskKind, pub kind: TaskKind,
pub name: String, pub name: String,
pub stage: TaskStage, pub stage: TaskStage,
@ -19,7 +20,7 @@ pub struct Task {
} }
impl Task { impl Task {
pub fn new(id: usize, kind: TaskKind, name: String) -> Self { pub fn new(id: Id, kind: TaskKind, name: String) -> Self {
Self { id, kind, name, ..Default::default() } Self { id, kind, name, ..Default::default() }
} }
} }
@ -61,15 +62,15 @@ impl From<&Task> for TaskSummary {
#[derive(Debug)] #[derive(Debug)]
pub enum TaskProg { pub enum TaskProg {
// id, size // id, size
New(usize, u64), New(Id, u64),
// id, processed, size // id, processed, size
Adv(usize, u32, u64), Adv(Id, u32, u64),
// id // id
Succ(usize), Succ(Id),
// id // id
Fail(usize, String), Fail(Id, String),
// id, line // id, line
Log(usize, String), Log(Id, String),
} }
#[derive(Clone, Debug, Default, Eq, PartialEq, Ord, PartialOrd)] #[derive(Clone, Debug, Default, Eq, PartialEq, Ord, PartialOrd)]

View file

@ -16,7 +16,7 @@ yazi-macro = { path = "../yazi-macro", version = "25.6.11" }
anyhow = { workspace = true } anyhow = { workspace = true }
crossterm = { workspace = true } crossterm = { workspace = true }
futures = { workspace = true } futures = { workspace = true }
memchr = "2.7.4" memchr = "2.7.5"
parking_lot = { workspace = true } parking_lot = { workspace = true }
percent-encoding = "2.3.1" percent-encoding = "2.3.1"
ratatui = { workspace = true } ratatui = { workspace = true }
@ -29,7 +29,7 @@ libc = { workspace = true }
uzers = { workspace = true } uzers = { workspace = true }
[target.'cfg(windows)'.dependencies] [target.'cfg(windows)'.dependencies]
windows-sys = { version = "0.59.0", features = [ "Win32_UI_Shell" ] } windows-sys = { version = "0.60.2", features = [ "Win32_UI_Shell" ] }
[target.'cfg(target_os = "macos")'.dependencies] [target.'cfg(target_os = "macos")'.dependencies]
crossterm = { workspace = true, features = [ "use-dev-tty", "libc" ] } crossterm = { workspace = true, features = [ "use-dev-tty", "libc" ] }

View file

@ -26,4 +26,4 @@ libc = { workspace = true }
crossterm = { workspace = true, features = [ "use-dev-tty", "libc" ] } crossterm = { workspace = true, features = [ "use-dev-tty", "libc" ] }
[target.'cfg(windows)'.dependencies] [target.'cfg(windows)'.dependencies]
windows-sys = { version = "0.59.0", features = [ "Win32_Globalization", "Win32_Storage_FileSystem", "Win32_System_IO", "Win32_System_Console", "Win32_System_Threading", "Win32_Security" ] } windows-sys = { version = "0.60.2", features = [ "Win32_Globalization", "Win32_Storage_FileSystem", "Win32_System_IO", "Win32_System_Console", "Win32_System_Threading", "Win32_Security" ] }