fix: only patch pid and require rebuilds (#4197)
This commit is contained in:
1 parent
b2bd1f48d4
commit
1d954c2f6f
5 files changed
+40
-10
No files matched your search
@@ -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
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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 {
|
||||
|
||||
@@ -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() };
|
||||
}
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
Reference in new issue
Block a user