mirror of
https://github.com/rust-lang/rust-analyzer
synced 2024-12-26 13:03:31 +00:00
Auto merge of #17842 - mo8it:crossbeam-channel, r=Veykril
internal: Optimize the usage of channel senders Used `Sender` directly instead of a boxed closure. There is no need to use the boxed closure. This also allows the caller to decide to do something other than `unwrap` (not a fan of it BTW).
This commit is contained in:
commit
aa845d033e
13 changed files with 41 additions and 34 deletions
1
Cargo.lock
generated
1
Cargo.lock
generated
|
@ -2317,6 +2317,7 @@ checksum = "49874b5167b65d7193b8aba1567f5c7d93d001cafc34600cee003eda787e483f"
|
||||||
name = "vfs"
|
name = "vfs"
|
||||||
version = "0.0.0"
|
version = "0.0.0"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
|
"crossbeam-channel",
|
||||||
"fst",
|
"fst",
|
||||||
"indexmap",
|
"indexmap",
|
||||||
"nohash-hasher",
|
"nohash-hasher",
|
||||||
|
|
|
@ -14,7 +14,7 @@ doctest = false
|
||||||
|
|
||||||
[dependencies]
|
[dependencies]
|
||||||
cov-mark = "2.0.0-pre.1"
|
cov-mark = "2.0.0-pre.1"
|
||||||
crossbeam-channel = "0.5.5"
|
crossbeam-channel.workspace = true
|
||||||
tracing.workspace = true
|
tracing.workspace = true
|
||||||
rayon.workspace = true
|
rayon.workspace = true
|
||||||
fst = { version = "0.4.7", default-features = false }
|
fst = { version = "0.4.7", default-features = false }
|
||||||
|
|
|
@ -64,8 +64,7 @@ pub fn load_workspace(
|
||||||
let (sender, receiver) = unbounded();
|
let (sender, receiver) = unbounded();
|
||||||
let mut vfs = vfs::Vfs::default();
|
let mut vfs = vfs::Vfs::default();
|
||||||
let mut loader = {
|
let mut loader = {
|
||||||
let loader =
|
let loader = vfs_notify::NotifyHandle::spawn(sender);
|
||||||
vfs_notify::NotifyHandle::spawn(Box::new(move |msg| sender.send(msg).unwrap()));
|
|
||||||
Box::new(loader)
|
Box::new(loader)
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -21,7 +21,7 @@ path = "src/bin/main.rs"
|
||||||
|
|
||||||
[dependencies]
|
[dependencies]
|
||||||
anyhow.workspace = true
|
anyhow.workspace = true
|
||||||
crossbeam-channel = "0.5.5"
|
crossbeam-channel.workspace = true
|
||||||
dirs = "5.0.1"
|
dirs = "5.0.1"
|
||||||
dissimilar.workspace = true
|
dissimilar.workspace = true
|
||||||
itertools.workspace = true
|
itertools.workspace = true
|
||||||
|
|
|
@ -109,7 +109,7 @@ pub(crate) struct FlycheckHandle {
|
||||||
impl FlycheckHandle {
|
impl FlycheckHandle {
|
||||||
pub(crate) fn spawn(
|
pub(crate) fn spawn(
|
||||||
id: usize,
|
id: usize,
|
||||||
sender: Box<dyn Fn(FlycheckMessage) + Send>,
|
sender: Sender<FlycheckMessage>,
|
||||||
config: FlycheckConfig,
|
config: FlycheckConfig,
|
||||||
sysroot_root: Option<AbsPathBuf>,
|
sysroot_root: Option<AbsPathBuf>,
|
||||||
workspace_root: AbsPathBuf,
|
workspace_root: AbsPathBuf,
|
||||||
|
@ -199,7 +199,7 @@ enum StateChange {
|
||||||
struct FlycheckActor {
|
struct FlycheckActor {
|
||||||
/// The workspace id of this flycheck instance.
|
/// The workspace id of this flycheck instance.
|
||||||
id: usize,
|
id: usize,
|
||||||
sender: Box<dyn Fn(FlycheckMessage) + Send>,
|
sender: Sender<FlycheckMessage>,
|
||||||
config: FlycheckConfig,
|
config: FlycheckConfig,
|
||||||
manifest_path: Option<AbsPathBuf>,
|
manifest_path: Option<AbsPathBuf>,
|
||||||
/// Either the workspace root of the workspace we are flychecking,
|
/// Either the workspace root of the workspace we are flychecking,
|
||||||
|
@ -235,7 +235,7 @@ pub(crate) const SAVED_FILE_PLACEHOLDER: &str = "$saved_file";
|
||||||
impl FlycheckActor {
|
impl FlycheckActor {
|
||||||
fn new(
|
fn new(
|
||||||
id: usize,
|
id: usize,
|
||||||
sender: Box<dyn Fn(FlycheckMessage) + Send>,
|
sender: Sender<FlycheckMessage>,
|
||||||
config: FlycheckConfig,
|
config: FlycheckConfig,
|
||||||
sysroot_root: Option<AbsPathBuf>,
|
sysroot_root: Option<AbsPathBuf>,
|
||||||
workspace_root: AbsPathBuf,
|
workspace_root: AbsPathBuf,
|
||||||
|
@ -478,8 +478,9 @@ impl FlycheckActor {
|
||||||
Some(cmd)
|
Some(cmd)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[track_caller]
|
||||||
fn send(&self, check_task: FlycheckMessage) {
|
fn send(&self, check_task: FlycheckMessage) {
|
||||||
(self.sender)(check_task);
|
self.sender.send(check_task).unwrap();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -185,8 +185,7 @@ impl GlobalState {
|
||||||
pub(crate) fn new(sender: Sender<lsp_server::Message>, config: Config) -> GlobalState {
|
pub(crate) fn new(sender: Sender<lsp_server::Message>, config: Config) -> GlobalState {
|
||||||
let loader = {
|
let loader = {
|
||||||
let (sender, receiver) = unbounded::<vfs::loader::Message>();
|
let (sender, receiver) = unbounded::<vfs::loader::Message>();
|
||||||
let handle: vfs_notify::NotifyHandle =
|
let handle: vfs_notify::NotifyHandle = vfs::loader::Handle::spawn(sender);
|
||||||
vfs::loader::Handle::spawn(Box::new(move |msg| sender.send(msg).unwrap()));
|
|
||||||
let handle = Box::new(handle) as Box<dyn vfs::loader::Handle>;
|
let handle = Box::new(handle) as Box<dyn vfs::loader::Handle>;
|
||||||
Handle { handle, receiver }
|
Handle { handle, receiver }
|
||||||
};
|
};
|
||||||
|
@ -564,8 +563,9 @@ impl GlobalState {
|
||||||
self.req_queue.incoming.is_completed(&request.id)
|
self.req_queue.incoming.is_completed(&request.id)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[track_caller]
|
||||||
fn send(&self, message: lsp_server::Message) {
|
fn send(&self, message: lsp_server::Message) {
|
||||||
self.sender.send(message).unwrap()
|
self.sender.send(message).unwrap();
|
||||||
}
|
}
|
||||||
|
|
||||||
pub(crate) fn publish_diagnostics(
|
pub(crate) fn publish_diagnostics(
|
||||||
|
|
|
@ -758,7 +758,7 @@ impl GlobalState {
|
||||||
self.flycheck = match invocation_strategy {
|
self.flycheck = match invocation_strategy {
|
||||||
crate::flycheck::InvocationStrategy::Once => vec![FlycheckHandle::spawn(
|
crate::flycheck::InvocationStrategy::Once => vec![FlycheckHandle::spawn(
|
||||||
0,
|
0,
|
||||||
Box::new(move |msg| sender.send(msg).unwrap()),
|
sender,
|
||||||
config,
|
config,
|
||||||
None,
|
None,
|
||||||
self.config.root_path().clone(),
|
self.config.root_path().clone(),
|
||||||
|
@ -793,10 +793,9 @@ impl GlobalState {
|
||||||
))
|
))
|
||||||
})
|
})
|
||||||
.map(|(id, (root, manifest_path), sysroot_root)| {
|
.map(|(id, (root, manifest_path), sysroot_root)| {
|
||||||
let sender = sender.clone();
|
|
||||||
FlycheckHandle::spawn(
|
FlycheckHandle::spawn(
|
||||||
id,
|
id,
|
||||||
Box::new(move |msg| sender.send(msg).unwrap()),
|
sender.clone(),
|
||||||
config.clone(),
|
config.clone(),
|
||||||
sysroot_root,
|
sysroot_root,
|
||||||
root.to_path_buf(),
|
root.to_path_buf(),
|
||||||
|
|
|
@ -17,7 +17,7 @@ backtrace = { version = "0.3.67", optional = true }
|
||||||
always-assert = { version = "0.2.0", features = ["tracing"] }
|
always-assert = { version = "0.2.0", features = ["tracing"] }
|
||||||
jod-thread = "0.1.2"
|
jod-thread = "0.1.2"
|
||||||
libc.workspace = true
|
libc.workspace = true
|
||||||
crossbeam-channel = "0.5.5"
|
crossbeam-channel.workspace = true
|
||||||
itertools.workspace = true
|
itertools.workspace = true
|
||||||
# Think twice before adding anything here
|
# Think twice before adding anything here
|
||||||
|
|
||||||
|
|
|
@ -15,7 +15,7 @@ doctest = false
|
||||||
[dependencies]
|
[dependencies]
|
||||||
tracing.workspace = true
|
tracing.workspace = true
|
||||||
walkdir = "2.3.2"
|
walkdir = "2.3.2"
|
||||||
crossbeam-channel = "0.5.5"
|
crossbeam-channel.workspace = true
|
||||||
notify = "6.1.1"
|
notify = "6.1.1"
|
||||||
rayon = "1.10.0"
|
rayon = "1.10.0"
|
||||||
|
|
||||||
|
|
|
@ -119,8 +119,7 @@ impl NotifyActor {
|
||||||
self.watched_dir_entries.clear();
|
self.watched_dir_entries.clear();
|
||||||
self.watched_file_entries.clear();
|
self.watched_file_entries.clear();
|
||||||
|
|
||||||
let send = |msg| (self.sender)(msg);
|
self.send(loader::Message::Progress {
|
||||||
send(loader::Message::Progress {
|
|
||||||
n_total,
|
n_total,
|
||||||
n_done: LoadingProgress::Started,
|
n_done: LoadingProgress::Started,
|
||||||
config_version,
|
config_version,
|
||||||
|
@ -130,7 +129,8 @@ impl NotifyActor {
|
||||||
let (entry_tx, entry_rx) = unbounded();
|
let (entry_tx, entry_rx) = unbounded();
|
||||||
let (watch_tx, watch_rx) = unbounded();
|
let (watch_tx, watch_rx) = unbounded();
|
||||||
let processed = AtomicUsize::new(0);
|
let processed = AtomicUsize::new(0);
|
||||||
config.load.into_par_iter().enumerate().for_each(move |(i, entry)| {
|
|
||||||
|
config.load.into_par_iter().enumerate().for_each(|(i, entry)| {
|
||||||
let do_watch = config.watch.contains(&i);
|
let do_watch = config.watch.contains(&i);
|
||||||
if do_watch {
|
if do_watch {
|
||||||
_ = entry_tx.send(entry.clone());
|
_ = entry_tx.send(entry.clone());
|
||||||
|
@ -140,18 +140,18 @@ impl NotifyActor {
|
||||||
entry,
|
entry,
|
||||||
do_watch,
|
do_watch,
|
||||||
|file| {
|
|file| {
|
||||||
send(loader::Message::Progress {
|
self.send(loader::Message::Progress {
|
||||||
n_total,
|
n_total,
|
||||||
n_done: LoadingProgress::Progress(
|
n_done: LoadingProgress::Progress(
|
||||||
processed.load(std::sync::atomic::Ordering::Relaxed),
|
processed.load(std::sync::atomic::Ordering::Relaxed),
|
||||||
),
|
),
|
||||||
dir: Some(file),
|
dir: Some(file),
|
||||||
config_version,
|
config_version,
|
||||||
})
|
});
|
||||||
},
|
},
|
||||||
);
|
);
|
||||||
send(loader::Message::Loaded { files });
|
self.send(loader::Message::Loaded { files });
|
||||||
send(loader::Message::Progress {
|
self.send(loader::Message::Progress {
|
||||||
n_total,
|
n_total,
|
||||||
n_done: LoadingProgress::Progress(
|
n_done: LoadingProgress::Progress(
|
||||||
processed.fetch_add(1, std::sync::atomic::Ordering::AcqRel) + 1,
|
processed.fetch_add(1, std::sync::atomic::Ordering::AcqRel) + 1,
|
||||||
|
@ -160,9 +160,13 @@ impl NotifyActor {
|
||||||
dir: None,
|
dir: None,
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
|
drop(watch_tx);
|
||||||
for path in watch_rx {
|
for path in watch_rx {
|
||||||
self.watch(&path);
|
self.watch(&path);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
drop(entry_tx);
|
||||||
for entry in entry_rx {
|
for entry in entry_rx {
|
||||||
match entry {
|
match entry {
|
||||||
loader::Entry::Files(files) => {
|
loader::Entry::Files(files) => {
|
||||||
|
@ -173,6 +177,7 @@ impl NotifyActor {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
self.send(loader::Message::Progress {
|
self.send(loader::Message::Progress {
|
||||||
n_total,
|
n_total,
|
||||||
n_done: LoadingProgress::Finished,
|
n_done: LoadingProgress::Finished,
|
||||||
|
@ -316,8 +321,9 @@ impl NotifyActor {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[track_caller]
|
||||||
fn send(&self, msg: loader::Message) {
|
fn send(&self, msg: loader::Message) {
|
||||||
(self.sender)(msg);
|
self.sender.send(msg).unwrap();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -18,6 +18,7 @@ tracing.workspace = true
|
||||||
fst = "0.4.7"
|
fst = "0.4.7"
|
||||||
indexmap.workspace = true
|
indexmap.workspace = true
|
||||||
nohash-hasher.workspace = true
|
nohash-hasher.workspace = true
|
||||||
|
crossbeam-channel.workspace = true
|
||||||
|
|
||||||
paths.workspace = true
|
paths.workspace = true
|
||||||
stdx.workspace = true
|
stdx.workspace = true
|
||||||
|
|
|
@ -72,7 +72,7 @@ pub enum Message {
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Type that will receive [`Messages`](Message) from a [`Handle`].
|
/// Type that will receive [`Messages`](Message) from a [`Handle`].
|
||||||
pub type Sender = Box<dyn Fn(Message) + Send + Sync>;
|
pub type Sender = crossbeam_channel::Sender<Message>;
|
||||||
|
|
||||||
/// Interface for reading and watching files.
|
/// Interface for reading and watching files.
|
||||||
pub trait Handle: fmt::Debug {
|
pub trait Handle: fmt::Debug {
|
||||||
|
|
|
@ -10,7 +10,7 @@ edition = "2021"
|
||||||
log = "0.4.17"
|
log = "0.4.17"
|
||||||
serde_json = "1.0.108"
|
serde_json = "1.0.108"
|
||||||
serde = { version = "1.0.192", features = ["derive"] }
|
serde = { version = "1.0.192", features = ["derive"] }
|
||||||
crossbeam-channel = "0.5.8"
|
crossbeam-channel.workspace = true
|
||||||
|
|
||||||
[dev-dependencies]
|
[dev-dependencies]
|
||||||
lsp-types = "=0.95"
|
lsp-types = "=0.95"
|
||||||
|
|
Loading…
Reference in a new issue