]> git.eshelyaron.com Git - emacs.git/commitdiff
Block atimers while loading native code scratch/native-timers-blocked
authorAndrea Corallo <andrea.corallo@arm.com>
Tue, 10 Jan 2023 15:15:58 +0000 (16:15 +0100)
committerAndrea Corallo <andrea.corallo@arm.com>
Tue, 10 Jan 2023 15:18:35 +0000 (16:18 +0100)
src/atimer.c
src/atimer.h
src/comp.c

index d07cdb82b7a1e59f7377b2955d5bb6b767704e1f..cefe8bf87b31b2931e5c48ee0cea712796c01ddc 100644 (file)
@@ -24,7 +24,6 @@ along with GNU Emacs.  If not, see <https://www.gnu.org/licenses/>.  */
 
 #include "lisp.h"
 #include "keyboard.h"
-#include "syssignal.h"
 #include "systime.h"
 #include "atimer.h"
 #include <unistd.h>
@@ -71,7 +70,7 @@ enum { timerfd = -1 };
 
 /* Block/unblock SIGALRM.  */
 
-static void
+void
 block_atimers (sigset_t *oldset)
 {
   sigset_t blocked;
@@ -80,7 +79,7 @@ block_atimers (sigset_t *oldset)
   sigaddset (&blocked, SIGINT);
   pthread_sigmask (SIG_BLOCK, &blocked, oldset);
 }
-static void
+void
 unblock_atimers (sigset_t const *oldset)
 {
   pthread_sigmask (SIG_SETMASK, oldset, 0);
index 551c186d24ea1f99b83b2481cdaef1256110a252..54d163c93fa79f7ffb0c65dde7c5b3d63548ab93 100644 (file)
@@ -20,6 +20,7 @@ along with GNU Emacs.  If not, see <https://www.gnu.org/licenses/>.  */
 #define EMACS_ATIMER_H
 
 #include <time.h>
+#include "syssignal.h"
 
 /* Forward declaration.  */
 
@@ -69,6 +70,8 @@ struct atimer
 
 /* Function prototypes.  */
 
+void block_atimers (sigset_t *);
+void unblock_atimers (sigset_t const *);
 struct atimer *start_atimer (enum atimer_type, struct timespec,
                              atimer_callback, void *);
 void cancel_atimer (struct atimer *);
index bd7ecfffc23b804991a35e3c714a5564435a244f..3cc5506f9893a63be4bf4e943b93f721d5fb74bb 100644 (file)
@@ -40,6 +40,7 @@ along with GNU Emacs.  If not, see <https://www.gnu.org/licenses/>.  */
 #include "md5.h"
 #include "sysstdio.h"
 #include "zlib.h"
+#include "atimer.h"
 
 \f
 /********************************/
@@ -5296,10 +5297,29 @@ unset_cu_load_ongoing (Lisp_Object comp_u)
   XNATIVE_COMP_UNIT (comp_u)->load_ongoing = false;
 }
 
+/* Number of native loads going on.  */
+unsigned loads;
+
+sigset_t oldset;
+
+static void
+maybe_unblock_atimers (Lisp_Object obj)
+{
+  --loads;
+  if (!loads)
+    unblock_atimers (&oldset);
+}
+
 Lisp_Object
 load_comp_unit (struct Lisp_Native_Comp_Unit *comp_u, bool loading_dump,
                bool late_load)
 {
+  specpdl_ref count = SPECPDL_INDEX ();
+  if (!loads)
+    block_atimers (&oldset);
+  ++loads;
+  record_unwind_protect (maybe_unblock_atimers, Qnil);
+
   Lisp_Object res = Qnil;
   dynlib_handle_ptr handle = comp_u->handle;
   Lisp_Object comp_u_lisp_obj;
@@ -5336,7 +5356,6 @@ load_comp_unit (struct Lisp_Native_Comp_Unit *comp_u, bool loading_dump,
      identify is we have at least another load active on it.  */
   bool recursive_load = comp_u->load_ongoing;
   comp_u->load_ongoing = true;
-  specpdl_ref count = SPECPDL_INDEX ();
   if (!recursive_load)
     record_unwind_protect (unset_cu_load_ongoing, comp_u_lisp_obj);
 
@@ -5437,9 +5456,7 @@ load_comp_unit (struct Lisp_Native_Comp_Unit *comp_u, bool loading_dump,
       eassert (check_comp_unit_relocs (comp_u));
     }
 
-  if (!recursive_load)
-    /* Clean-up the load ongoing flag in case.  */
-    unbind_to (count, Qnil);
+  unbind_to (count, Qnil);
 
   register_native_comp_unit (comp_u_lisp_obj);