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 09:26:10 +0100

> I tried applying it via git apply - which failed.

Sorry.  My mailer probably mangled it.  I'll attach newer versions.

> After applying your
> patch manually, I still does not work - the testcase results in a
> hanging emacs.  I might have screwed the application of the patch up,
> though.  Can anyone confirm my result?

I can't test emacsclient well on my system (Windows XP).  Also, here
`frame-list' seems broken.  It's OK with one frame but for > 1 frame
evaluating (frame-list) can sometimes return nil.  I have to check
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.

In any case the patch I attached now tries to

(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.

martin
=== modified file 'src/frame.c'
*** src/frame.c 2012-01-19 07:21:25 +0000
--- src/frame.c 2012-02-22 07:35:19 +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 (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]