From mboxrd@z Thu Jan 1 00:00:00 1970 Path: news.gmane.org!not-for-mail From: martin rudalics Newsgroups: gmane.emacs.devel Subject: Re: emacs 24 randomly hanging Date: Tue, 21 Feb 2012 17:54:13 +0100 Message-ID: <4F43CC35.60407@gmx.at> References: <878vjzz920.fsf@earth.home> <87sji4mpwn.fsf@this.that> NNTP-Posting-Host: plane.gmane.org Mime-Version: 1.0 Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit X-Trace: dough.gmane.org 1329843228 31180 80.91.229.3 (21 Feb 2012 16:53:48 GMT) X-Complaints-To: usenet@dough.gmane.org NNTP-Posting-Date: Tue, 21 Feb 2012 16:53:48 +0000 (UTC) Cc: emacs-devel@gnu.org To: Dan Nicolaescu Original-X-From: emacs-devel-bounces+ged-emacs-devel=m.gmane.org@gnu.org Tue Feb 21 17:53:47 2012 Return-path: Envelope-to: ged-emacs-devel@m.gmane.org Original-Received: from lists.gnu.org ([140.186.70.17]) by plane.gmane.org with esmtp (Exim 4.69) (envelope-from ) id 1RzsyH-0004ym-Ax for ged-emacs-devel@m.gmane.org; Tue, 21 Feb 2012 17:53:45 +0100 Original-Received: from localhost ([::1]:47518 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1RzsyG-0005CC-8i for ged-emacs-devel@m.gmane.org; Tue, 21 Feb 2012 11:53:44 -0500 Original-Received: from eggs.gnu.org ([140.186.70.92]:45581) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1RzsyA-00058i-Uk for emacs-devel@gnu.org; Tue, 21 Feb 2012 11:53:43 -0500 Original-Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1Rzsxv-0000Wp-Vc for emacs-devel@gnu.org; Tue, 21 Feb 2012 11:53:38 -0500 Original-Received: from mailout-de.gmx.net ([213.165.64.22]:45527) by eggs.gnu.org with smtp (Exim 4.71) (envelope-from ) id 1Rzsxv-0000WT-Mi for emacs-devel@gnu.org; Tue, 21 Feb 2012 11:53:23 -0500 Original-Received: (qmail invoked by alias); 21 Feb 2012 16:53:21 -0000 Original-Received: from 62-47-48-93.adsl.highway.telekom.at (EHLO [62.47.48.93]) [62.47.48.93] by mail.gmx.net (mp028) with SMTP; 21 Feb 2012 17:53:21 +0100 X-Authenticated: #14592706 X-Provags-ID: V01U2FsdGVkX19BFMgclCBBmIOkawqcOF86aHNrMjoKF/pS7+5eP/ XNn2rzL6mUJ0Fr In-Reply-To: X-Y-GMX-Trusted: 0 X-detected-operating-system: by eggs.gnu.org: Genre and OS details not recognized. X-Received-From: 213.165.64.22 X-BeenThere: emacs-devel@gnu.org X-Mailman-Version: 2.1.14 Precedence: list List-Id: "Emacs development discussions." List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: emacs-devel-bounces+ged-emacs-devel=m.gmane.org@gnu.org Original-Sender: emacs-devel-bounces+ged-emacs-devel=m.gmane.org@gnu.org Xref: news.gmane.org gmane.emacs.devel:148698 Archived-At: > It looks like there's an infinite loop in frame.c:next_frame. Does the patch below help? martin === modified file 'src/frame.c' --- src/frame.c 2012-01-19 07:21:25 +0000 +++ src/frame.c 2012-02-21 16:46:43 +0000 @@ -924,7 +924,7 @@ static Lisp_Object next_frame (Lisp_Object frame, Lisp_Object minibuf) { - Lisp_Object tail; + Lisp_Object tail, frames; int passed = 0; /* There must always be at least one frame in Vframe_list. */ @@ -935,58 +935,57 @@ forever. Forestall that. */ CHECK_LIVE_FRAME (frame); + frames = Fcopy_sequence (Vframe_list); while (1) - for (tail = Vframe_list; CONSP (tail); tail = XCDR (tail)) + for (tail = frames; 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))))) + if (passed) { - /* 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; + /* Decide whether this frame is eligible to be returned. */ + else 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; + } } - - if (EQ (frame, f)) + else if (EQ (frame, f)) passed++; } }