emacs-devel
[Top][All Lists]
Advanced

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

Re: emacs 24 randomly hanging


From: martin rudalics
Subject: Re: emacs 24 randomly hanging
Date: Wed, 22 Feb 2012 10:41:31 +0100

>> 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
=== 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 via email to

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