From mboxrd@z Thu Jan 1 00:00:00 1970 Path: news.gmane.org!not-for-mail From: Ken Brown Newsgroups: gmane.emacs.bugs Subject: bug#17510: 24.3.91; Problem with `emacs --daemon' in cygw32 build Date: Sun, 18 May 2014 15:36:11 -0400 Message-ID: <53790BAB.3020909@cornell.edu> References: <53764FD9.8090600@cornell.edu> <53766FBC.1000601@cornell.edu> <5377F335.2080609@cornell.edu> <831tvremfz.fsf@gnu.org> <5378C404.8050405@cornell.edu> <83wqdjceah.fsf@gnu.org> NNTP-Posting-Host: plane.gmane.org Mime-Version: 1.0 Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 7bit X-Trace: ger.gmane.org 1400441843 4472 80.91.229.3 (18 May 2014 19:37:23 GMT) X-Complaints-To: usenet@ger.gmane.org NNTP-Posting-Date: Sun, 18 May 2014 19:37:23 +0000 (UTC) Cc: 17510@debbugs.gnu.org, dmantipov@yandex.ru To: Eli Zaretskii Original-X-From: bug-gnu-emacs-bounces+geb-bug-gnu-emacs=m.gmane.org@gnu.org Sun May 18 21:37:16 2014 Return-path: Envelope-to: geb-bug-gnu-emacs@m.gmane.org Original-Received: from lists.gnu.org ([208.118.235.17]) by plane.gmane.org with esmtp (Exim 4.69) (envelope-from ) id 1Wm6tX-0005Ij-Va for geb-bug-gnu-emacs@m.gmane.org; Sun, 18 May 2014 21:37:16 +0200 Original-Received: from localhost ([::1]:44469 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1Wm6tX-0003gs-IA for geb-bug-gnu-emacs@m.gmane.org; Sun, 18 May 2014 15:37:15 -0400 Original-Received: from eggs.gnu.org ([2001:4830:134:3::10]:47945) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1Wm6tQ-0003ft-32 for bug-gnu-emacs@gnu.org; Sun, 18 May 2014 15:37:12 -0400 Original-Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1Wm6tL-0006ZR-70 for bug-gnu-emacs@gnu.org; Sun, 18 May 2014 15:37:08 -0400 Original-Received: from debbugs.gnu.org ([140.186.70.43]:53525) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1Wm6tL-0006ZI-4L for bug-gnu-emacs@gnu.org; Sun, 18 May 2014 15:37:03 -0400 Original-Received: from Debian-debbugs by debbugs.gnu.org with local (Exim 4.80) (envelope-from ) id 1Wm6tK-00021m-Fm for bug-gnu-emacs@gnu.org; Sun, 18 May 2014 15:37:02 -0400 X-Loop: help-debbugs@gnu.org Resent-From: Ken Brown Original-Sender: "Debbugs-submit" Resent-CC: bug-gnu-emacs@gnu.org Resent-Date: Sun, 18 May 2014 19:37:02 +0000 Resent-Message-ID: Resent-Sender: help-debbugs@gnu.org X-GNU-PR-Message: followup 17510 X-GNU-PR-Package: emacs X-GNU-PR-Keywords: Original-Received: via spool by 17510-submit@debbugs.gnu.org id=B17510.14004417857750 (code B ref 17510); Sun, 18 May 2014 19:37:02 +0000 Original-Received: (at 17510) by debbugs.gnu.org; 18 May 2014 19:36:25 +0000 Original-Received: from localhost ([127.0.0.1]:52402 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.80) (envelope-from ) id 1Wm6si-00020v-31 for submit@debbugs.gnu.org; Sun, 18 May 2014 15:36:24 -0400 Original-Received: from limerock02.mail.cornell.edu ([128.84.12.100]:34349) by debbugs.gnu.org with esmtp (Exim 4.80) (envelope-from ) id 1Wm6sf-00020e-0r for 17510@debbugs.gnu.org; Sun, 18 May 2014 15:36:22 -0400 X-CornellRouted: This message has been Routed already. Original-Received: from authusersmtp.mail.cornell.edu (granite3.serverfarm.cornell.edu [10.16.197.8]) by limerock02.mail.cornell.edu (8.14.4/8.14.4_cu) with ESMTP id s4IJaDr2020824; Sun, 18 May 2014 15:36:14 -0400 Original-Received: from [192.168.1.8] (cpe-67-249-194-47.twcny.res.rr.com [67.249.194.47]) (authenticated bits=0) by authusersmtp.mail.cornell.edu (8.14.4/8.12.10) with ESMTP id s4IJaBal005791 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES128-SHA bits=128 verify=NOT); Sun, 18 May 2014 15:36:13 -0400 User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:24.0) Gecko/20100101 Thunderbird/24.5.0 In-Reply-To: <83wqdjceah.fsf@gnu.org> X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.15 Precedence: list X-detected-operating-system: by eggs.gnu.org: GNU/Linux 3.x X-Received-From: 140.186.70.43 X-BeenThere: bug-gnu-emacs@gnu.org List-Id: "Bug reports for GNU Emacs, the Swiss army knife of text editors" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: bug-gnu-emacs-bounces+geb-bug-gnu-emacs=m.gmane.org@gnu.org Original-Sender: bug-gnu-emacs-bounces+geb-bug-gnu-emacs=m.gmane.org@gnu.org Xref: news.gmane.org gmane.emacs.bugs:89215 Archived-At: On 5/18/2014 11:11 AM, Eli Zaretskii wrote: >> Date: Sun, 18 May 2014 10:30:28 -0400 >> From: Ken Brown >> CC: 17510@debbugs.gnu.org, dmantipov@yandex.ru >> >> On 5/18/2014 12:32 AM, Eli Zaretskii wrote: >>> Thanks, but you need to be more selective: which one of these changes >>> is the root cause, and why? >> >> It's not easy to be selective; these aren't independent changes. There >> used to be a `w32_display_name_list', which Dmitry removed. Along with >> this change, he removed the code that used to be in x_delete_display (to >> delete a display from the list) and replaced it by a FIXME. > > Perhaps that FIXME is not relevant to Cygwin, and the removed code > should be retained in the Cygwin build. > >>> In general, everything that is related to one_w32_display_info is >>> specific to the WINDOWSNT port, so perhaps the problem is that the >>> Cygwin-w32 build is incorrectly treated the same. But where exactly? >> >> Looking at the code, I don't see why this problem is specific to the >> Cygwin-w32 build. > > If the Cygwin-w32 build wants more (or less) than one display_info > object, then that part _is_ specific to Cygwin, because the native > Windows build has only one such object that is never deleted. > >> Can you reproduce it in the Windows build? > > The native Windows build doesn't support --daemon, so no, I can't. > >> I *think* what must be happening in the recipe that I gave for this bug >> is that every time a client frame is closed, x_delete_display is called. >> Before Dmitry's change, this would actually delete something from a >> list. Now it doesn't, and the server gets messed up and ultimately dies >> on the third attempt to create a client frame. > > See above: try restoring that code for Cygwin only. > >> Unless there's an obvious fix for this, it seems to me that we're far >> enough into the pretest that we should just revert to the old code, at >> least for emacs-24. > > That would revert a useful cleanup, which I'm not sure is a good idea > at this point. How does this look? === modified file 'src/w32fns.c' --- src/w32fns.c 2014-05-06 16:00:30 +0000 +++ src/w32fns.c 2014-05-18 19:21:41 +0000 @@ -5188,9 +5188,22 @@ CHECK_STRING (name); +#ifdef CYGWIN /* See comment in w32term.c */ + Lisp_Object names; + for (dpyinfo = &one_w32_display_info, names = cygw32_display_name_list; + dpyinfo && !NILP (cygw32_display_name_list); + dpyinfo = dpyinfo->next, names = XCDR (names)) + { + Lisp_Object tem; + tem = Fstring_equal (XCAR (XCAR (names)), name); + if (!NILP (tem)) + return dpyinfo; + } +#else /* !CYGWIN */ for (dpyinfo = &one_w32_display_info; dpyinfo; dpyinfo = dpyinfo->next) if (!NILP (Fstring_equal (XCAR (dpyinfo->name_list_element), name))) return dpyinfo; +#endif /* !CYGWIN */ /* Use this general default value to start with. */ Vx_resource_name = Vinvocation_name; @@ -5326,10 +5339,17 @@ (void) { Lisp_Object result = Qnil; + +#ifdef CYGWIN + Lisp_Object tail; + for (tail = cygw32_display_name_list; CONSP (tail); tail = XCDR (tail)) + result = Fcons (XCAR (XCAR (tail)), result); +#else struct w32_display_info *wdi; for (wdi = x_display_list; wdi; wdi = wdi->next) result = Fcons (XCAR (wdi->name_list_element), result); +#endif return result; } === modified file 'src/w32term.c' --- src/w32term.c 2014-04-16 14:00:39 +0000 +++ src/w32term.c 2014-05-18 19:24:17 +0000 @@ -100,6 +100,17 @@ struct w32_display_info one_w32_display_info; struct w32_display_info *x_display_list; +/* In order to support "emacs --daemon" on the Cygwin-w32 build, we + maintain a list of display names. (This compensates for the fact + that the one display can't be deleted. See Bug#17510 and the FIXME + in x_delete_display below.) This is a list of cons cells, each of + the form (NAME . FONT-LIST-CACHE). NAME is the name of the frame. + FONT-LIST-CACHE records previous values returned by + x-list-fonts. */ +#ifdef CYGWIN +Lisp_Object cygw32_display_name_list; +#endif + #if _WIN32_WINNT < 0x0500 && !defined(_W64) /* Pre Windows 2000, this was not available, but define it here so that Emacs compiled on such a platform will run on newer versions. @@ -6162,6 +6173,10 @@ memset (dpyinfo, 0, sizeof (*dpyinfo)); dpyinfo->name_list_element = Fcons (display_name, Qnil); +#ifdef CYGWIN + cygw32_display_name_list = Fcons (dpyinfo->name_list_element, + cygw32_display_name_list); +#endif dpyinfo->w32_id_name = xmalloc (SCHARS (Vinvocation_name) + SCHARS (Vsystem_name) + 2); sprintf (dpyinfo->w32_id_name, "%s@%s", @@ -6411,6 +6426,26 @@ x_delete_display (struct w32_display_info *dpyinfo) { /* FIXME: the only display info apparently can't be deleted. */ +#ifdef CYGWIN + if (! NILP (cygw32_display_name_list) + && EQ (XCAR (cygw32_display_name_list), dpyinfo->name_list_element)) + cygw32_display_name_list = XCDR (cygw32_display_name_list); + else + { + Lisp_Object tail; + + tail = cygw32_display_name_list; + while (CONSP (tail) && CONSP (XCDR (tail))) + { + if (EQ (XCAR (XCDR (tail)), dpyinfo->name_list_element)) + { + XSETCDR (tail, XCDR (XCDR (tail))); + break; + } + tail = XCDR (tail); + } + } +#endif /* CYGWIN */ /* free palette table */ { struct w32_palette_entry * plist; @@ -6547,6 +6582,9 @@ void syms_of_w32term (void) { + staticpro (&cygw32_display_name_list); + cygw32_display_name_list = Qnil; + DEFSYM (Qvendor_specific_keysyms, "vendor-specific-keysyms"); DEFSYM (Qadded, "added"); === modified file 'src/w32term.h' --- src/w32term.h 2014-02-04 16:13:51 +0000 +++ src/w32term.h 2014-05-18 19:13:35 +0000 @@ -200,6 +200,10 @@ extern struct w32_display_info *x_display_list; extern struct w32_display_info one_w32_display_info; +#ifdef CYGWIN +extern Lisp_Object cygw32_display_name_list; +#endif + extern struct frame *x_window_to_frame (struct w32_display_info *, HWND); struct w32_display_info *x_display_info_for_name (Lisp_Object);