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