[Top][All Lists]
[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++;
}
}
- emacs 24 randomly hanging, Adam, 2012/02/19
- Re: emacs 24 randomly hanging, Adam, 2012/02/19
- Re: emacs 24 randomly hanging, Andreas Schwab, 2012/02/19
- Re: emacs 24 randomly hanging, Dan Nicolaescu, 2012/02/20
- Re: emacs 24 randomly hanging, Adam, 2012/02/21
- Re: emacs 24 randomly hanging, Dan Nicolaescu, 2012/02/21
- Re: emacs 24 randomly hanging, martin rudalics, 2012/02/21
- Re: emacs 24 randomly hanging, Adam, 2012/02/21
- Re: emacs 24 randomly hanging,
martin rudalics <=
- Re: emacs 24 randomly hanging, Andreas Schwab, 2012/02/22
- Re: emacs 24 randomly hanging, martin rudalics, 2012/02/22
- Re: emacs 24 randomly hanging, Stefan Monnier, 2012/02/22
- Re: emacs 24 randomly hanging, martin rudalics, 2012/02/24
- Re: emacs 24 randomly hanging, Chong Yidong, 2012/02/22
- Re: emacs 24 randomly hanging, Eli Zaretskii, 2012/02/22
- Re: emacs 24 randomly hanging, Chong Yidong, 2012/02/23
- Re: emacs 24 randomly hanging, Christopher Schmidt, 2012/02/23
- Re: emacs 24 randomly hanging, Chong Yidong, 2012/02/23
- Re: emacs 24 randomly hanging, Christopher Schmidt, 2012/02/23