Browse Source

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

Jonathan Kelley 1 month ago
parent
commit
1d954c2f6f

+ 22 - 6
packages/cli/src/serve/mod.rs

@@ -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 - 0
packages/cli/src/serve/runner.rs

@@ -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 - 0
packages/cli/src/serve/server.rs

@@ -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 - 0
packages/devtools-types/src/lib.rs

@@ -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
packages/devtools/src/lib.rs

@@ -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() };
+                }
             }
         }
     });