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: Wed, 22 Feb 2012 09:26:10 +0100 Message-ID: <4F44A6A2.8040701@gmx.at> References: <878vjzz920.fsf@earth.home> <87sji4mpwn.fsf@this.that> <4F43CC35.60407@gmx.at> <8762f0qbam.fsf@this.that> NNTP-Posting-Host: plane.gmane.org Mime-Version: 1.0 Content-Type: multipart/mixed; boundary="------------030807050605000505060606" X-Trace: dough.gmane.org 1329899193 30160 80.91.229.3 (22 Feb 2012 08:26:33 GMT) X-Complaints-To: usenet@dough.gmane.org NNTP-Posting-Date: Wed, 22 Feb 2012 08:26:33 +0000 (UTC) To: emacs-devel@gnu.org Original-X-From: emacs-devel-bounces+ged-emacs-devel=m.gmane.org@gnu.org Wed Feb 22 09:26:29 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 1S07Wv-0007SI-0n for ged-emacs-devel@m.gmane.org; Wed, 22 Feb 2012 09:26:29 +0100 Original-Received: from localhost ([::1]:58304 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1S07Wu-0001hr-1U for ged-emacs-devel@m.gmane.org; Wed, 22 Feb 2012 03:26:28 -0500 Original-Received: from eggs.gnu.org ([140.186.70.92]:58869) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1S07Wl-0001hm-PD for emacs-devel@gnu.org; Wed, 22 Feb 2012 03:26:25 -0500 Original-Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1S07Wf-0001TZ-Om for emacs-devel@gnu.org; Wed, 22 Feb 2012 03:26:19 -0500 Original-Received: from mailout-de.gmx.net ([213.165.64.22]:56375) by eggs.gnu.org with smtp (Exim 4.71) (envelope-from ) id 1S07Wf-0001TQ-Ee for emacs-devel@gnu.org; Wed, 22 Feb 2012 03:26:13 -0500 Original-Received: (qmail invoked by alias); 22 Feb 2012 08:26:11 -0000 Original-Received: from 62-47-38-254.adsl.highway.telekom.at (EHLO [62.47.38.254]) [62.47.38.254] by mail.gmx.net (mp012) with SMTP; 22 Feb 2012 09:26:11 +0100 X-Authenticated: #14592706 X-Provags-ID: V01U2FsdGVkX1+EoiEBHq2E+r6io5OAvMXed1mFL/1V1t7CLFu/Xx 2krUF/QD8n2Uf9 In-Reply-To: <8762f0qbam.fsf@this.that> 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:148702 Archived-At: This is a multi-part message in MIME format. --------------030807050605000505060606 Content-Type: text/plain; charset=ISO-8859-15; format=flowed Content-Transfer-Encoding: 7bit > 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 --------------030807050605000505060606 Content-Type: text/plain; name="frame.c.diff" Content-Transfer-Encoding: 7bit Content-Disposition: inline; filename="frame.c.diff" === 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++; } } --------------030807050605000505060606--