fix: only patch pid and require rebuilds (#4197)

This commit is contained in:
Jonathan Kelley authored and GitHub committed 2025-05-25 14:45:53 +01:00
1 parent b2bd1f48d4
commit 1d954c2f6f
5 files changed
+40 -10

No files matched your search

+22 -6
View File
@@ -1,6 +1,6 @@
use crate::{
styles::{GLOW_STYLE, LINK_STYLE},
AppBuilder, BuildId, BuildMode, BuilderUpdate, Result, ServeArgs, TraceController,
AppBuilder, BuildId, BuildMode, BuilderUpdate, Platform, Result, ServeArgs, TraceController,
};
mod ansi_buffer;
@@ -140,7 +140,13 @@ pub(crate) async fn serve_all(args: ServeArgs, tracer: &mut TraceController) ->
let elapsed =
bundle.time_end.duration_since(bundle.time_start).unwrap();
match builder.hotpatch(&bundle, id, cache).await {
Ok(jumptable) => devserver.send_patch(jumptable, elapsed, id).await,
Ok(jumptable) => {
let pid = match id {
BuildId::CLIENT => builder.client.pid,
_ => builder.server.as_ref().and_then(|s| s.pid),
};
devserver.send_patch(jumptable, elapsed, id, pid).await
}
Err(err) => {
tracing::error!("Failed to hot-patch app: {err}");
@@ -189,11 +195,21 @@ pub(crate) async fn serve_all(args: ServeArgs, tracer: &mut TraceController) ->
screen.push_log(log);
}
ServeUpdate::OpenApp => {
if let Err(err) = builder.open_all(&devserver, true).await {
tracing::error!("Failed to open app: {err}")
ServeUpdate::OpenApp => match builder.use_hotpatch_engine {
true if !matches!(builder.client.build.platform, Platform::Web) => {
tracing::warn!(
"Opening a native app with hotpatching enabled requires a full rebuild..."
);
builder.full_rebuild().await;
devserver.send_reload_start().await;
devserver.start_build().await;
}
}
_ => {
if let Err(err) = builder.open_all(&devserver, true).await {
tracing::error!("Failed to open app: {err}")
}
}
},
ServeUpdate::Redraw => {
// simply returning will cause a redraw
+1
View File
@@ -433,6 +433,7 @@ impl AppServer {
ms_elapsed: 0,
jump_table: Default::default(),
for_build_id: None,
for_pid: None,
};
self.add_hot_reload_message(&msg);
+2
View File
@@ -304,12 +304,14 @@ impl WebServer {
jump_table: JumpTable,
time_taken: Duration,
build: BuildId,
for_pid: Option<u32>,
) {
let msg = DevserverMsg::HotReload(HotReloadMsg {
jump_table: Some(jump_table),
ms_elapsed: time_taken.as_millis() as u64,
templates: vec![],
assets: vec![],
for_pid,
for_build_id: Some(build.0 as _),
});
self.send_devserver_message_to_all(msg).await;
+1
View File
@@ -46,6 +46,7 @@ pub struct HotReloadMsg {
pub ms_elapsed: u64,
pub jump_table: Option<JumpTable>,
pub for_build_id: Option<u64>,
pub for_pid: Option<u32>,
}
impl HotReloadMsg {
+14 -4
View File
@@ -36,9 +36,17 @@ pub fn try_apply_changes(dom: &VirtualDom, msg: &HotReloadMsg) -> Result<(), Pat
// 2. Attempt to hotpatch
if let Some(jump_table) = msg.jump_table.as_ref().cloned() {
if msg.for_build_id == Some(dioxus_cli_config::build_id()) {
unsafe { subsecond::apply_patch(jump_table) }?;
dioxus_core::prelude::force_all_dirty();
ctx.clear::<Signal<Option<HotReloadedTemplate>>>();
let our_pid = if cfg!(target_family = "wasm") {
None
} else {
Some(std::process::id())
};
if msg.for_pid == our_pid {
unsafe { subsecond::apply_patch(jump_table) }?;
dioxus_core::prelude::force_all_dirty();
ctx.clear::<Signal<Option<HotReloadedTemplate>>>();
}
}
}
@@ -69,7 +77,9 @@ pub fn connect_subsecond() {
connect(|msg| {
if let DevserverMsg::HotReload(hot_reload_msg) = msg {
if let Some(jumptable) = hot_reload_msg.jump_table {
unsafe { subsecond::apply_patch(jumptable).unwrap() };
if hot_reload_msg.for_pid == Some(std::process::id()) {
unsafe { subsecond::apply_patch(jumptable).unwrap() };
}
}
}
});