Skip to content

Commit d3bb065

Browse files
committed
Replace crossbeam_channel with async_channel for hot reloading.
1 parent 78d940c commit d3bb065

File tree

6 files changed

+24
-28
lines changed

6 files changed

+24
-28
lines changed

crates/bevy_asset/Cargo.toml

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,7 @@ async-broadcast = { version = "0.7.2", default-features = false }
4545
async-fs = { version = "2.0", default-features = false }
4646
async-lock = { version = "3.0", default-features = false }
4747
bitflags = { version = "2.3", default-features = false }
48+
async-channel = { version = "2", default-features = false }
4849
crossbeam-channel = { version = "0.5", default-features = false, features = [
4950
"std",
5051
] }
@@ -91,9 +92,6 @@ notify-debouncer-full = { version = "0.5.0", default-features = false, optional
9192
ureq = { version = "3", optional = true, default-features = false }
9293
blocking = { version = "1.6", optional = true }
9394

94-
[dev-dependencies]
95-
async-channel = "2"
96-
9795
[lints]
9896
workspace = true
9997

crates/bevy_asset/src/io/file/file_watcher.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,8 @@ use crate::{
33
path::normalize_path,
44
};
55
use alloc::borrow::ToOwned;
6+
use async_channel::Sender;
67
use core::time::Duration;
7-
use crossbeam_channel::Sender;
88
use notify_debouncer_full::{
99
new_debouncer,
1010
notify::{

crates/bevy_asset/src/io/source.rs

Lines changed: 13 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -125,7 +125,7 @@ pub struct AssetSourceBuilder {
125125
/// The [`AssetWatcher`] to use for unprocessed assets, if any.
126126
pub watcher: Option<
127127
Box<
128-
dyn FnMut(crossbeam_channel::Sender<AssetSourceEvent>) -> Option<Box<dyn AssetWatcher>>
128+
dyn FnMut(async_channel::Sender<AssetSourceEvent>) -> Option<Box<dyn AssetWatcher>>
129129
+ Send
130130
+ Sync,
131131
>,
@@ -138,7 +138,7 @@ pub struct AssetSourceBuilder {
138138
/// The [`AssetWatcher`] to use for processed assets, if any.
139139
pub processed_watcher: Option<
140140
Box<
141-
dyn FnMut(crossbeam_channel::Sender<AssetSourceEvent>) -> Option<Box<dyn AssetWatcher>>
141+
dyn FnMut(async_channel::Sender<AssetSourceEvent>) -> Option<Box<dyn AssetWatcher>>
142142
+ Send
143143
+ Sync,
144144
>,
@@ -174,7 +174,7 @@ impl AssetSourceBuilder {
174174
};
175175

176176
if watch {
177-
let (sender, receiver) = crossbeam_channel::unbounded();
177+
let (sender, receiver) = async_channel::unbounded();
178178
match self.watcher.as_mut().and_then(|w| w(sender)) {
179179
Some(w) => {
180180
source.watcher = Some(w);
@@ -189,7 +189,7 @@ impl AssetSourceBuilder {
189189
}
190190

191191
if watch_processed {
192-
let (sender, receiver) = crossbeam_channel::unbounded();
192+
let (sender, receiver) = async_channel::unbounded();
193193
match self.processed_watcher.as_mut().and_then(|w| w(sender)) {
194194
Some(w) => {
195195
source.processed_watcher = Some(w);
@@ -226,7 +226,7 @@ impl AssetSourceBuilder {
226226
/// Will use the given `watcher` function to construct unprocessed [`AssetWatcher`] instances.
227227
pub fn with_watcher(
228228
mut self,
229-
watcher: impl FnMut(crossbeam_channel::Sender<AssetSourceEvent>) -> Option<Box<dyn AssetWatcher>>
229+
watcher: impl FnMut(async_channel::Sender<AssetSourceEvent>) -> Option<Box<dyn AssetWatcher>>
230230
+ Send
231231
+ Sync
232232
+ 'static,
@@ -256,7 +256,7 @@ impl AssetSourceBuilder {
256256
/// Will use the given `watcher` function to construct processed [`AssetWatcher`] instances.
257257
pub fn with_processed_watcher(
258258
mut self,
259-
watcher: impl FnMut(crossbeam_channel::Sender<AssetSourceEvent>) -> Option<Box<dyn AssetWatcher>>
259+
watcher: impl FnMut(async_channel::Sender<AssetSourceEvent>) -> Option<Box<dyn AssetWatcher>>
260260
+ Send
261261
+ Sync
262262
+ 'static,
@@ -377,8 +377,8 @@ pub struct AssetSource {
377377
processed_writer: Option<Box<dyn ErasedAssetWriter>>,
378378
watcher: Option<Box<dyn AssetWatcher>>,
379379
processed_watcher: Option<Box<dyn AssetWatcher>>,
380-
event_receiver: Option<crossbeam_channel::Receiver<AssetSourceEvent>>,
381-
processed_event_receiver: Option<crossbeam_channel::Receiver<AssetSourceEvent>>,
380+
event_receiver: Option<async_channel::Receiver<AssetSourceEvent>>,
381+
processed_event_receiver: Option<async_channel::Receiver<AssetSourceEvent>>,
382382
}
383383

384384
impl AssetSource {
@@ -429,15 +429,13 @@ impl AssetSource {
429429

430430
/// Return's this source's unprocessed event receiver, if the source is currently watching for changes.
431431
#[inline]
432-
pub fn event_receiver(&self) -> Option<&crossbeam_channel::Receiver<AssetSourceEvent>> {
432+
pub fn event_receiver(&self) -> Option<&async_channel::Receiver<AssetSourceEvent>> {
433433
self.event_receiver.as_ref()
434434
}
435435

436436
/// Return's this source's processed event receiver, if the source is currently watching for changes.
437437
#[inline]
438-
pub fn processed_event_receiver(
439-
&self,
440-
) -> Option<&crossbeam_channel::Receiver<AssetSourceEvent>> {
438+
pub fn processed_event_receiver(&self) -> Option<&async_channel::Receiver<AssetSourceEvent>> {
441439
self.processed_event_receiver.as_ref()
442440
}
443441

@@ -517,10 +515,9 @@ impl AssetSource {
517515
pub fn get_default_watcher(
518516
path: String,
519517
file_debounce_wait_time: Duration,
520-
) -> impl FnMut(crossbeam_channel::Sender<AssetSourceEvent>) -> Option<Box<dyn AssetWatcher>>
521-
+ Send
522-
+ Sync {
523-
move |sender: crossbeam_channel::Sender<AssetSourceEvent>| {
518+
) -> impl FnMut(async_channel::Sender<AssetSourceEvent>) -> Option<Box<dyn AssetWatcher>> + Send + Sync
519+
{
520+
move |sender: async_channel::Sender<AssetSourceEvent>| {
524521
#[cfg(all(
525522
feature = "file_watcher",
526523
not(target_arch = "wasm32"),

crates/bevy_asset/src/lib.rs

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -737,6 +737,7 @@ mod tests {
737737
vec,
738738
vec::Vec,
739739
};
740+
use async_channel::{Receiver, Sender};
740741
use bevy_app::{App, TaskPoolPlugin, Update};
741742
use bevy_diagnostic::{DiagnosticsPlugin, DiagnosticsStore};
742743
use bevy_ecs::{
@@ -750,7 +751,6 @@ mod tests {
750751
};
751752
use bevy_reflect::TypePath;
752753
use core::time::Duration;
753-
use crossbeam_channel::Sender;
754754
use serde::{Deserialize, Serialize};
755755
use std::path::{Path, PathBuf};
756756
use thiserror::Error;
@@ -2153,8 +2153,8 @@ mod tests {
21532153
// we've selected the reader. The GatedReader blocks this process, so we need to wait until
21542154
// we gate in the loader instead.
21552155
struct GatedLoader {
2156-
in_loader_sender: async_channel::Sender<()>,
2157-
gate_receiver: async_channel::Receiver<()>,
2156+
in_loader_sender: Sender<()>,
2157+
gate_receiver: Receiver<()>,
21582158
}
21592159

21602160
impl AssetLoader for GatedLoader {
@@ -2381,7 +2381,7 @@ mod tests {
23812381
// Sending an asset event should result in the asset being reloaded - resulting in a
23822382
// "Modified" message.
23832383
source_events
2384-
.send(AssetSourceEvent::ModifiedAsset(PathBuf::from(
2384+
.send_blocking(AssetSourceEvent::ModifiedAsset(PathBuf::from(
23852385
"abc.cool.ron",
23862386
)))
23872387
.unwrap();
@@ -2436,7 +2436,7 @@ mod tests {
24362436
)"#,
24372437
);
24382438
source_events
2439-
.send(AssetSourceEvent::AddedAsset(PathBuf::from("abc.cool.ron")))
2439+
.send_blocking(AssetSourceEvent::AddedAsset(PathBuf::from("abc.cool.ron")))
24402440
.unwrap();
24412441

24422442
run_app_until(&mut app, |world| {

crates/bevy_asset/src/processor/mod.rs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -274,7 +274,8 @@ impl AssetProcessor {
274274

275275
for source in self.data.sources.iter_processed() {
276276
if let Some(receiver) = source.event_receiver() {
277-
for event in receiver.try_iter() {
277+
// TODO: Handle TryRecvError::Closed.
278+
while let Ok(event) = receiver.try_recv() {
278279
if !started_processing {
279280
self.set_state(ProcessorState::Processing).await;
280281
started_processing = true;

crates/bevy_asset/src/server/mod.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1836,14 +1836,14 @@ pub fn handle_internal_asset_events(world: &mut World) {
18361836
match server.data.mode {
18371837
AssetServerMode::Unprocessed => {
18381838
if let Some(receiver) = source.event_receiver() {
1839-
for event in receiver.try_iter() {
1839+
while let Ok(event) = receiver.try_recv() {
18401840
handle_event(source.id(), event);
18411841
}
18421842
}
18431843
}
18441844
AssetServerMode::Processed => {
18451845
if let Some(receiver) = source.processed_event_receiver() {
1846-
for event in receiver.try_iter() {
1846+
while let Ok(event) = receiver.try_recv() {
18471847
handle_event(source.id(), event);
18481848
}
18491849
}

0 commit comments

Comments
 (0)