all messages for Emacs-related lists mirrored at yhetil.org
 help / color / mirror / code / Atom feed
From: martin rudalics <rudalics@gmx.at>
To: Dan Nicolaescu <dann@gnu.org>
Cc: emacs-devel@gnu.org
Subject: Re: emacs 24 randomly hanging
Date: Tue, 21 Feb 2012 17:54:13 +0100	[thread overview]
Message-ID: <4F43CC35.60407@gmx.at> (raw)
In-Reply-To: <yxqty2kkxcg.fsf@fencepost.gnu.org>

 > It looks like there's an infinite loop in frame.c:next_frame.

Does the patch below help?

martin


=== modified file 'src/frame.c'
--- src/frame.c	2012-01-19 07:21:25 +0000
+++ src/frame.c	2012-02-21 16:46:43 +0000
@@ -924,7 +924,7 @@
  static Lisp_Object
  next_frame (Lisp_Object frame, Lisp_Object minibuf)
  {
-  Lisp_Object tail;
+  Lisp_Object tail, frames;
    int passed = 0;

    /* There must always be at least one frame in Vframe_list.  */
@@ -935,58 +935,57 @@
       forever.  Forestall that.  */
    CHECK_LIVE_FRAME (frame);

+  frames = Fcopy_sequence (Vframe_list);
    while (1)
-    for (tail = Vframe_list; CONSP (tail); tail = XCDR (tail))
+    for (tail = frames; CONSP (tail); tail = XCDR (tail))
        {
  	Lisp_Object f;

  	f = XCAR (tail);
-
-	if (passed
-	    && ((!FRAME_TERMCAP_P (XFRAME (f)) && !FRAME_TERMCAP_P (XFRAME (frame))
-                 && FRAME_KBOARD (XFRAME (f)) == FRAME_KBOARD (XFRAME (frame)))
-                || (FRAME_TERMCAP_P (XFRAME (f)) && FRAME_TERMCAP_P (XFRAME (frame))
-                    && FRAME_TTY (XFRAME (f)) == FRAME_TTY (XFRAME (frame)))))
+	if (passed)
  	  {
-	    /* Decide whether this frame is eligible to be returned.  */
-
  	    /* If we've looped all the way around without finding any
  	       eligible frames, return the original frame.  */
  	    if (EQ (f, frame))
  	      return f;
-
-	    /* Let minibuf decide if this frame is acceptable.  */
-	    if (NILP (minibuf))
-	      {
-		if (! FRAME_MINIBUF_ONLY_P (XFRAME (f)))
-		  return f;
-	      }
-	    else if (EQ (minibuf, Qvisible))
-	      {
-		FRAME_SAMPLE_VISIBILITY (XFRAME (f));
-		if (FRAME_VISIBLE_P (XFRAME (f)))
-		  return f;
-	      }
-	    else if (INTEGERP (minibuf) && XINT (minibuf) == 0)
-	      {
-		FRAME_SAMPLE_VISIBILITY (XFRAME (f));
-		if (FRAME_VISIBLE_P (XFRAME (f))
-		    || FRAME_ICONIFIED_P (XFRAME (f)))
-		  return f;
-	      }
-	    else if (WINDOWP (minibuf))
-	      {
-		if (EQ (FRAME_MINIBUF_WINDOW (XFRAME (f)), minibuf)
-		    || EQ (WINDOW_FRAME (XWINDOW (minibuf)), f)
-		    || EQ (WINDOW_FRAME (XWINDOW (minibuf)),
-			   FRAME_FOCUS_FRAME (XFRAME (f))))
-		  return f;
-	      }
-	    else
-	      return f;
+	    /* Decide whether this frame is eligible to be returned.  */
+	    else if ((!FRAME_TERMCAP_P (XFRAME (f)) && !FRAME_TERMCAP_P (XFRAME (frame))
+		      && FRAME_KBOARD (XFRAME (f)) == FRAME_KBOARD (XFRAME (frame)))
+		     || (FRAME_TERMCAP_P (XFRAME (f)) && FRAME_TERMCAP_P (XFRAME (frame))
+			 && FRAME_TTY (XFRAME (f)) == FRAME_TTY (XFRAME (frame))))
+	      {
+		/* Let minibuf decide if this frame is acceptable.  */
+		if (NILP (minibuf))
+		  {
+		    if (! FRAME_MINIBUF_ONLY_P (XFRAME (f)))
+		      return f;
+		  }
+		else if (EQ (minibuf, Qvisible))
+		  {
+		    FRAME_SAMPLE_VISIBILITY (XFRAME (f));
+		    if (FRAME_VISIBLE_P (XFRAME (f)))
+		      return f;
+		  }
+		else if (INTEGERP (minibuf) && XINT (minibuf) == 0)
+		  {
+		    FRAME_SAMPLE_VISIBILITY (XFRAME (f));
+		    if (FRAME_VISIBLE_P (XFRAME (f))
+			|| FRAME_ICONIFIED_P (XFRAME (f)))
+		      return f;
+		  }
+		else if (WINDOWP (minibuf))
+		  {
+		    if (EQ (FRAME_MINIBUF_WINDOW (XFRAME (f)), minibuf)
+			|| EQ (WINDOW_FRAME (XWINDOW (minibuf)), f)
+			|| EQ (WINDOW_FRAME (XWINDOW (minibuf)),
+			       FRAME_FOCUS_FRAME (XFRAME (f))))
+		      return f;
+		  }
+		else
+		  return f;
+	      }
  	  }
-
-	if (EQ (frame, f))
+	else if (EQ (frame, f))
  	  passed++;
        }
  }





  reply	other threads:[~2012-02-21 16:54 UTC|newest]

Thread overview: 22+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2012-02-19  5:28 emacs 24 randomly hanging Adam
2012-02-19  9:45 ` Adam
2012-02-19  9:54 ` Andreas Schwab
2012-02-20  7:23   ` Adam
2012-02-20 15:34 ` Dan Nicolaescu
2012-02-21 10:10   ` Adam
2012-02-21 10:43 ` Adam
2012-02-21 15:41   ` Dan Nicolaescu
2012-02-21 16:54     ` martin rudalics [this message]
2012-02-21 18:42       ` Adam
2012-02-22  8:26         ` martin rudalics
2012-02-22  9:01           ` Andreas Schwab
2012-02-22  9:41             ` martin rudalics
2012-02-22 14:49               ` Stefan Monnier
2012-02-24 18:43                 ` martin rudalics
2012-02-22 10:55             ` Chong Yidong
2012-02-22 16:28               ` Eli Zaretskii
2012-02-23  8:05                 ` Chong Yidong
2012-02-23 14:03                   ` Christopher Schmidt
2012-02-23 16:39                     ` Christopher Schmidt
2012-02-23 17:42                     ` Chong Yidong
2012-02-24 18:43                   ` martin rudalics

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=4F43CC35.60407@gmx.at \
    --to=rudalics@gmx.at \
    --cc=dann@gnu.org \
    --cc=emacs-devel@gnu.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
Code repositories for project(s) associated with this external index

	https://git.savannah.gnu.org/cgit/emacs.git
	https://git.savannah.gnu.org/cgit/emacs/org-mode.git

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.