]> git.eshelyaron.com Git - emacs.git/commitdiff
Avoid inflooping in redisplay due to Spacemacs and linum-mode
authorEli Zaretskii <eliz@gnu.org>
Wed, 31 May 2017 09:05:06 +0000 (12:05 +0300)
committerEli Zaretskii <eliz@gnu.org>
Wed, 31 May 2017 09:05:06 +0000 (12:05 +0300)
* src/xdisp.c (redisplay_internal): Limit the number of redisplay
retries when a frame becomes garbaged as result of redisplaying
it.  (Bug#27115)

src/xdisp.c

index c03689bf6169a3cdfb3098c8a74c86ecadadfc21..f4461c1627a0d3bb9038ffc103a15b73b7c4cafd 100644 (file)
@@ -13648,6 +13648,14 @@ redisplay_internal (void)
   enum { MAX_HSCROLL_RETRIES = 16 };
   int hscroll_retries = 0;
 
+  /* Limit the number of retries for when frame(s) become garbaged as
+     result of redisplaying them.  Some packages set various redisplay
+     hooks, such as window-scroll-functions, to run Lisp that always
+     calls APIs which cause the frame's garbaged flag to become set,
+     so we loop indefinitely.  */
+  enum {MAX_GARBAGED_FRAME_RETRIES = 2 };
+  int garbaged_frame_retries = 0;
+
   /* True means redisplay has to consider all windows on all
      frames.  False, only selected_window is considered.  */
   bool consider_all_windows_p;
@@ -14194,7 +14202,8 @@ redisplay_internal (void)
                      garbage.  We have to start over.  These cases
                      should be rare, so going all the way back to the
                      top of redisplay should be good enough.  */
-                  if (FRAME_GARBAGED_P (f))
+                  if (FRAME_GARBAGED_P (f)
+                     && garbaged_frame_retries++ < MAX_GARBAGED_FRAME_RETRIES)
                     goto retry;
 
 #if defined (HAVE_WINDOW_SYSTEM) && !defined (HAVE_NS)