all messages for Emacs-related lists mirrored at yhetil.org
 help / color / mirror / code / Atom feed
From: martin rudalics <rudalics@gmx.at>
To: Andreas Schwab <schwab@linux-m68k.org>
Cc: emacs-devel@gnu.org
Subject: Re: emacs 24 randomly hanging
Date: Wed, 22 Feb 2012 10:41:31 +0100	[thread overview]
Message-ID: <4F44B84B.5020203@gmx.at> (raw)
In-Reply-To: <m2zkcbutqs.fsf@igel.home>

[-- Attachment #1: Type: text/plain, Size: 1190 bytes --]

 >> what's going on here, IIUC it takes some time (at least a couple of
 >> seconds) for a frame to show up on Vframe_list.
 >
 > It should not matter at all, because x_create_frame cannot make the new
 > frame known to lisp before it is added to Vframe_alist.

I suppose you mean Vframe_list.  At least on my system I can see frames
that are not returned by `frame-list'.

 >> (1) Check whether the frame passed to next_frame is in Vframe_list and
 >>     quit if it isn't.
 >>
 >> (2) Put a maximum of 100 frames investigated on the loop in next_frame
 >>     so there should be no endless looping otherwise.
 >
 > This is just doctoring the symptoms.

What did you expect me to do?  I first have to find out whether the
looping really is in next_frame.  Or do you have a definitive clue?

BTW my doctoring patch has an obvious bug which should be corrected in
the new attachment.

 > There is an invariant that *every*
 > live frame is on Vframe_alist.  If that invariant is violated then this
 > is the bug that must be fixed.

Such an invariant seems obvious but I don't see it neither formulated
nor preserved.  And why is Vframe_alist "V" prefixed but not available
in Lisp?

martin

[-- Attachment #2: frame.c.diff --]
[-- Type: text/plain, Size: 3684 bytes --]

=== modified file 'src/frame.c'
*** src/frame.c	2012-01-19 07:21:25 +0000
--- src/frame.c	2012-02-22 09:30:41 +0000
***************
*** 935,992 ****
       forever.  Forestall that.  */
    CHECK_LIVE_FRAME (frame);
  
!   while (1)
      for (tail = Vframe_list; 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)))))
  	  {
- 	    /* 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;
  	  }
  
! 	if (EQ (frame, f))
  	  passed++;
        }
  }
--- 935,997 ----
       forever.  Forestall that.  */
    CHECK_LIVE_FRAME (frame);
  
!   while (!NILP (Fmemq (frame, Vframe_list)) && (passed < 100))
      for (tail = Vframe_list; CONSP (tail); tail = XCDR (tail))
        {
  	Lisp_Object f;
  
  	f = XCAR (tail);
  
! 	if (passed)
  	  {
  	    /* If we've looped all the way around without finding any
  	       eligible frames, return the original frame.  */
  	    if (EQ (f, frame))
  	      return f;
! 	    else
  	      {
! 		passed++;
! 
! 		/* Decide whether this frame is eligible to be returned.  */
! 		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;
! 		  }
  	      }
  	  }
  
! 	else if (EQ (frame, f))
  	  passed++;
        }
  }


  reply	other threads:[~2012-02-22  9:41 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
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 [this message]
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=4F44B84B.5020203@gmx.at \
    --to=rudalics@gmx.at \
    --cc=emacs-devel@gnu.org \
    --cc=schwab@linux-m68k.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.