emacs-diffs
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

feature/native-comp 4fba79f 2/2: Add late load pdumper hooks so these ca


From: Andrea Corallo
Subject: feature/native-comp 4fba79f 2/2: Add late load pdumper hooks so these can call into Lisp
Date: Wed, 10 Feb 2021 16:04:11 -0500 (EST)

branch: feature/native-comp
commit 4fba79feee58e074d112bb47467913f9aec089c7
Author: Andrea Corallo <akrl@sdf.org>
Commit: Andrea Corallo <akrl@sdf.org>

    Add late load pdumper hooks so these can call into Lisp
    
        * src/pdumper.h (pdumper_do_now_and_after_late_load): New function.
        * src/pdumper.c (dump_late_hooks, nr_dump_late_hooks): New static
        variables.
        (dump_metadata_for_pdumper): Add support for late load hooks.
        (pdumper_do_now_and_after_late_load_impl): New functions.
        (pdumper_load): Add support for late load hooks.
        * src/window.c (init_window_once): Register
        'init_window_once_for_pdumper' to be executed after late load.
---
 src/pdumper.c | 24 ++++++++++++++++++++++++
 src/pdumper.h | 13 +++++++++++++
 src/window.c  |  2 +-
 3 files changed, 38 insertions(+), 1 deletion(-)

diff --git a/src/pdumper.c b/src/pdumper.c
index f071107..1f1f6e0 100644
--- a/src/pdumper.c
+++ b/src/pdumper.c
@@ -121,6 +121,9 @@ static const char dump_magic[16] = {
 static pdumper_hook dump_hooks[24];
 static int nr_dump_hooks = 0;
 
+static pdumper_hook dump_late_hooks[24];
+static int nr_dump_late_hooks = 0;
+
 static struct
 {
   void *mem;
@@ -3245,6 +3248,12 @@ dump_metadata_for_pdumper (struct dump_context *ctx)
                                       (void const *) dump_hooks[i]);
   dump_emacs_reloc_immediate_int (ctx, &nr_dump_hooks, nr_dump_hooks);
 
+  for (int i = 0; i < nr_dump_late_hooks; ++i)
+    dump_emacs_reloc_to_emacs_ptr_raw (ctx, &dump_late_hooks[i],
+                                      (void const *) dump_late_hooks[i]);
+  dump_emacs_reloc_immediate_int (ctx, &nr_dump_late_hooks,
+                                 nr_dump_late_hooks);
+
   for (int i = 0; i < nr_remembered_data; ++i)
     {
       dump_emacs_reloc_to_emacs_ptr_raw (ctx, &remembered_data[i].mem,
@@ -4316,6 +4325,15 @@ pdumper_do_now_and_after_load_impl (pdumper_hook hook)
   hook ();
 }
 
+void
+pdumper_do_now_and_after_late_load_impl (pdumper_hook hook)
+{
+  if (nr_dump_late_hooks == ARRAYELTS (dump_late_hooks))
+    fatal ("out of dump hooks: make dump_late_hooks[] bigger");
+  dump_late_hooks[nr_dump_late_hooks++] = hook;
+  hook ();
+}
+
 static void
 pdumper_remember_user_data_1 (void *mem, int nbytes)
 {
@@ -5597,6 +5615,12 @@ pdumper_load (const char *dump_filename, char *argv0, 
char const *original_pwd)
 
   dump_do_all_dump_reloc_for_phase (header, dump_base, LATE_RELOCS);
   dump_do_all_dump_reloc_for_phase (header, dump_base, VERY_LATE_RELOCS);
+
+  /* Run the functions Emacs registered for doing post-dump-load
+     initialization.  */
+  for (int i = 0; i < nr_dump_late_hooks; ++i)
+    dump_late_hooks[i] ();
+
   initialized = true;
 
   struct timespec load_timespec =
diff --git a/src/pdumper.h b/src/pdumper.h
index 24e99e2..49e6739 100644
--- a/src/pdumper.h
+++ b/src/pdumper.h
@@ -81,6 +81,7 @@ pdumper_remember_lv_ptr_raw (void *ptr, enum Lisp_Type type)
 
 typedef void (*pdumper_hook)(void);
 extern void pdumper_do_now_and_after_load_impl (pdumper_hook hook);
+extern void pdumper_do_now_and_after_late_load_impl (pdumper_hook hook);
 
 INLINE void
 pdumper_do_now_and_after_load (pdumper_hook hook)
@@ -92,6 +93,18 @@ pdumper_do_now_and_after_load (pdumper_hook hook)
 #endif
 }
 
+/* Same as 'pdumper_do_now_and_after_load' but for hooks running code
+   that can call into Lisp.  */
+INLINE void
+pdumper_do_now_and_after_late_load (pdumper_hook hook)
+{
+#ifdef HAVE_PDUMPER
+  pdumper_do_now_and_after_late_load_impl (hook);
+#else
+  hook ();
+#endif
+}
+
 /* Macros useful in pdumper callback functions.  Assign a value if
    we're loading a dump and the value needs to be reset to its
    original value, and if we're initializing for the first time,
diff --git a/src/window.c b/src/window.c
index eb16e2a..f8b9728 100644
--- a/src/window.c
+++ b/src/window.c
@@ -8134,7 +8134,7 @@ init_window_once (void)
   minibuf_selected_window = Qnil;
   staticpro (&minibuf_selected_window);
 
-  pdumper_do_now_and_after_load (init_window_once_for_pdumper);
+  pdumper_do_now_and_after_late_load (init_window_once_for_pdumper);
 }
 
 static void init_window_once_for_pdumper (void)



reply via email to

[Prev in Thread] Current Thread [Next in Thread]