
# Objective - Enable hot patching systems with subsecond - Fixes #19296 ## Solution - First commit is the naive thin layer - Second commit only check the jump table when the code is hot patched instead of on every system execution - Depends on https://github.com/DioxusLabs/dioxus/pull/4153 for a nicer API, but could be done without - Everything in second commit is feature gated, it has no impact when the feature is not enabled ## Testing - Check dependencies without the feature enabled: nothing dioxus in tree - Run the new example: text and color can be changed --------- Co-authored-by: Jan Hohenheim <jan@hohenheim.ch> Co-authored-by: JMS55 <47158642+JMS55@users.noreply.github.com>
43 lines
1.4 KiB
Rust
43 lines
1.4 KiB
Rust
//! Utilities for hotpatching code.
|
|
extern crate alloc;
|
|
|
|
use alloc::sync::Arc;
|
|
|
|
use bevy_ecs::{event::EventWriter, HotPatched};
|
|
#[cfg(not(target_family = "wasm"))]
|
|
use dioxus_devtools::connect_subsecond;
|
|
use dioxus_devtools::subsecond;
|
|
|
|
pub use dioxus_devtools::subsecond::{call, HotFunction};
|
|
|
|
use crate::{Last, Plugin};
|
|
|
|
/// Plugin connecting to Dioxus CLI to enable hot patching.
|
|
#[derive(Default)]
|
|
pub struct HotPatchPlugin;
|
|
|
|
impl Plugin for HotPatchPlugin {
|
|
fn build(&self, app: &mut crate::App) {
|
|
let (sender, receiver) = crossbeam_channel::bounded::<HotPatched>(1);
|
|
|
|
// Connects to the dioxus CLI that will handle rebuilds
|
|
// This will open a connection to the dioxus CLI to receive updated jump tables
|
|
// Sends a `HotPatched` message through the channel when the jump table is updated
|
|
#[cfg(not(target_family = "wasm"))]
|
|
connect_subsecond();
|
|
subsecond::register_handler(Arc::new(move || {
|
|
sender.send(HotPatched).unwrap();
|
|
}));
|
|
|
|
// Adds a system that will read the channel for new `HotPatched`, and forward them as event to the ECS
|
|
app.add_event::<HotPatched>().add_systems(
|
|
Last,
|
|
move |mut events: EventWriter<HotPatched>| {
|
|
if receiver.try_recv().is_ok() {
|
|
events.write_default();
|
|
}
|
|
},
|
|
);
|
|
}
|
|
}
|