[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 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++;
}
}
- Re: emacs 24 randomly hanging, (continued)
- 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, 2012/02/22
- Re: emacs 24 randomly hanging, Andreas Schwab, 2012/02/22
- Re: emacs 24 randomly hanging,
martin rudalics <=
- 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
- Re: emacs 24 randomly hanging, martin rudalics, 2012/02/24