From mboxrd@z Thu Jan 1 00:00:00 1970 Path: news.gmane.org!not-for-mail From: Dmitry Antipov Newsgroups: gmane.emacs.bugs Subject: bug#15876: 24.3.50; Highly degraded performance between rev 114715 and 115006 Date: Thu, 05 Dec 2013 10:29:45 +0400 Message-ID: <52A01D59.7030304@yandex.ru> References: <867gcdiqji.fsf@somewhere.org> <86fvr09z55.fsf@somewhere.org> <83fvr01du4.fsf@gnu.org> <8638n0nj9p.fsf@somewhere.org> <86bo1eaelv.fsf@somewhere.org> <86r4a2vqbu.fsf@somewhere.org> <867gbqdisp.fsf@somewhere.org> <83haas5y88.fsf@gnu.org> <529C64C5.2040509@yandex.ru> <834n6r5edh.fsf@gnu.org> <529DAAED.9000504@yandex.ru> <83ob4y3wi5.fsf@gnu.org> <529DF416.7070807@yandex.ru> <83txeo33ls.fsf@gnu.org> NNTP-Posting-Host: plane.gmane.org Mime-Version: 1.0 Content-Type: multipart/mixed; boundary="------------050000050903010104050202" X-Trace: ger.gmane.org 1386225023 3457 80.91.229.3 (5 Dec 2013 06:30:23 GMT) X-Complaints-To: usenet@ger.gmane.org NNTP-Posting-Date: Thu, 5 Dec 2013 06:30:23 +0000 (UTC) Cc: sva-news@mygooglest.com, 15876@debbugs.gnu.org To: Eli Zaretskii Original-X-From: bug-gnu-emacs-bounces+geb-bug-gnu-emacs=m.gmane.org@gnu.org Thu Dec 05 07:30:28 2013 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 1VoSSB-0005ko-A6 for geb-bug-gnu-emacs@m.gmane.org; Thu, 05 Dec 2013 07:30:27 +0100 Original-Received: from localhost ([::1]:51974 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1VoSSA-0005Ia-3h for geb-bug-gnu-emacs@m.gmane.org; Thu, 05 Dec 2013 01:30:26 -0500 Original-Received: from eggs.gnu.org ([2001:4830:134:3::10]:58125) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1VoSRx-0005GU-CP for bug-gnu-emacs@gnu.org; Thu, 05 Dec 2013 01:30:20 -0500 Original-Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1VoSRn-0001jm-Ro for bug-gnu-emacs@gnu.org; Thu, 05 Dec 2013 01:30:13 -0500 Original-Received: from debbugs.gnu.org ([140.186.70.43]:44803) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1VoSRn-0001j4-OL for bug-gnu-emacs@gnu.org; Thu, 05 Dec 2013 01:30:03 -0500 Original-Received: from Debian-debbugs by debbugs.gnu.org with local (Exim 4.80) (envelope-from ) id 1VoSRm-0000yr-2B for bug-gnu-emacs@gnu.org; Thu, 05 Dec 2013 01:30:02 -0500 X-Loop: help-debbugs@gnu.org Resent-From: Dmitry Antipov Original-Sender: "Debbugs-submit" Resent-CC: bug-gnu-emacs@gnu.org Resent-Date: Thu, 05 Dec 2013 06:30:01 +0000 Resent-Message-ID: Resent-Sender: help-debbugs@gnu.org X-GNU-PR-Message: followup 15876 X-GNU-PR-Package: emacs X-GNU-PR-Keywords: Original-Received: via spool by 15876-submit@debbugs.gnu.org id=B15876.13862249953723 (code B ref 15876); Thu, 05 Dec 2013 06:30:01 +0000 Original-Received: (at 15876) by debbugs.gnu.org; 5 Dec 2013 06:29:55 +0000 Original-Received: from localhost ([127.0.0.1]:58822 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.80) (envelope-from ) id 1VoSRe-0000xv-5M for submit@debbugs.gnu.org; Thu, 05 Dec 2013 01:29:54 -0500 Original-Received: from forward4o.mail.yandex.net ([37.140.190.33]:59572) by debbugs.gnu.org with esmtp (Exim 4.80) (envelope-from ) id 1VoSRY-0000xj-Jw for 15876@debbugs.gnu.org; Thu, 05 Dec 2013 01:29:50 -0500 Original-Received: from smtp2o.mail.yandex.net (smtp2o.mail.yandex.net [37.140.190.27]) by forward4o.mail.yandex.net (Yandex) with ESMTP id 4A98256419AD; Thu, 5 Dec 2013 10:29:46 +0400 (MSK) Original-Received: from smtp2o.mail.yandex.net (localhost [127.0.0.1]) by smtp2o.mail.yandex.net (Yandex) with ESMTP id E55F836A0618; Thu, 5 Dec 2013 10:29:45 +0400 (MSK) Original-Received: from unknown (unknown [37.139.80.10]) by smtp2o.mail.yandex.net (nwsmtp/Yandex) with ESMTP id jWUPMW5eR1-TjeO0vYZ; Thu, 5 Dec 2013 10:29:45 +0400 (using TLSv1 with cipher CAMELLIA256-SHA (256/256 bits)) (Client certificate not present) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=yandex.ru; s=mail; t=1386224985; bh=aD+qi19FmVdVKzsuQj4IsxWh0KeOGTsYcVvcmnLsZIY=; h=Message-ID:Date:From:User-Agent:MIME-Version:To:CC:Subject: References:In-Reply-To:Content-Type; b=TRzEzA1ewgM1jiZw4lU/zj3NjZgImgYUIvSbkuVsn5UKmUleLXxD50gbAEBubwD7/ LGJySKp/gn8U48KHRzeRc4QkNPJvj9APqohwzpZxOhYI/g/9G7N0Vo1mN8IzF2GznW vs38L6VkULci5uE0vBrTJZdMrKSgE7o+XYHsK8qE= Authentication-Results: smtp2o.mail.yandex.net; dkim=pass header.i=@yandex.ru User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:24.0) Gecko/20100101 Thunderbird/24.1.1 In-Reply-To: <83txeo33ls.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:81418 Archived-At: This is a multi-part message in MIME format. --------------050000050903010104050202 Content-Type: text/plain; charset=UTF-8; format=flowed Content-Transfer-Encoding: 7bit On 12/04/2013 09:53 PM, Eli Zaretskii wrote: > What kind of information do I need to collect on Windows to make it > clear where the problem is? Can you suggest some code that would > collect the necessary information, or ideas for writing such code? > (It's inconvenient to collect the data in GDB, since many objects are > marked at this point, and printing them from GDB crashes Emacs.) OK, let's try the following steps. 1. Apply attached patch and rebuild. 2. Run emacs -Q, then M-x insert-char 25b7 and M-x describe-char. Now you should know the C pointer to font object which is used to display right-pointing triangle (underlined red on screenshot). 3. Insert GDB breakpoints to fprintf, move cursor, do some basic editing around the triangle and run M-x garbage-collect few times. An interesting font object should be either marked or swept; if it's markerd, you should hit the breakpoint "GCX: mark interesting font Y". For my --without-xft build, M-x garbage-collect always shows that an interesting font object is marked in expected way - via face cache. E.g.: (gdb) bt 8 #0 __fprintf (stream=0x3869dbb1e0 <_IO_2_1_stderr_>, format=0x6cf620 "GC%ld: mark interesting font %p\n") at fprintf.c:27 #1 0x00000000005c7269 in mark_vectorlike (ptr=0xd7c8b8) at ../../trunk/src/alloc.c:5745 #2 0x00000000005c75a4 in mark_face_cache (c=0x11456b0) at ../../trunk/src/alloc.c:5838 #3 0x00000000005c7b43 in mark_object (arg=...) at ../../trunk/src/alloc.c:6014 #4 0x00000000005c7288 in mark_vectorlike (ptr=0x127d4f8) at ../../trunk/src/alloc.c:5754 #5 0x00000000005c7baa in mark_object (arg=...) at ../../trunk/src/alloc.c:6031 #6 0x00000000005c7288 in mark_vectorlike (ptr=0xcf3230) at ../../trunk/src/alloc.c:5754 #7 0x00000000005c7457 in mark_buffer (buffer=0xcf3230) at ../../trunk/src/alloc.c:5805 (More stack frames follow...) Dmitry --------------050000050903010104050202 Content-Type: image/png; name="font-pointer.png" Content-Transfer-Encoding: base64 Content-Disposition: attachment; filename="font-pointer.png" iVBORw0KGgoAAAANSUhEUgAAA0IAAALhCAIAAAD9w4PXAAAACXBIWXMAAA7EAAAOxAGVKw4b AAAAB3RJTUUH3QwFBhMJjOQ95gAAAB1pVFh0Q29tbWVudAAAAAAAQ3JlYXRlZCB3aXRoIEdJ TVBkLmUHAAAgAElEQVR42uzd3680yX3f92/V9DnPefbZ51muyOVyl7+5JJcrUY7EwDci4nAT XdgKxAAScmmLV8mV4QC6CGDZgiw4iRPs2khs55p/g0wQgQNkKTuEJFsko58UaVE2I5NLcsld 7vP7/JiuXPRMnz5d1dXfru6e6ZrzfklYzjOnf1b3TH+mqrvKWGuttcZYERERY8Q5EREjIsa4 6h8ApqT/WBmKYjSzWhXvfOcz73rXex4+vP+DH3z30aOHim8211rCM888+8lP/qcffeGlN9/8 4R/98Vf+8i//4sGDe845ESdittObzT+dE2OKVfGuZ97zUz/5sx9/8ZNHxfHZ2dmP3/7Rn/7p 1771rT97+OC+28zinBNjzGq1euc73/3ix//Ki5/46VtP3FqtVi+99NHXvvR/f+1r//YHP3j9 8eOHDx8+sNY+8673/PRf+avve++Hb9y4sVoVp2ePy/XarlYru/rRj974/ve/c+vW7eeff/+t W0+en1+cnT1er9cnJ0/0FJCpvu836tey3b6quOr/Dr0u6KevV+q/qJfknHPittsR3Bhz9R8m vvDmXvv/VO5aczMary//HtzIaj31xjRZe+WfdclvXf6zd/Oqs7RxFK/MZer/u3zRs+/Ola6t 1GzPdsnNEg6UdmjtzdPQ1XvUcdwDRer/88rimiV79Qh2fFOZ+thVe9HeWpEnbj5x+/bNX/7l /+rNt976iaeffvOtt0Tkm9/4Dx9/8UP/79e+LiJf//o3nHPPPfdsZJpvfevbb7zx+osvvhiZ xty69eQ73vETTzzxpNkev3pjy9KN+S4Ont8p38Fiug9t43NgGgVpgmfemG3o/oT07aFRX4nd iEtabC2m/s7oLMbNHlRbMMWFdcy+NGd1s13mg+Vw9atk+CnkJi2HcRfF+GR9X5qBM8pFP+b9 kcxMXGI9nyxzuXcru7p95+mnn37XvXs/fvPNN9brdX18y3UpRqyx1Xo3ReHEGOMuLximKIqn nvqJj77w0vPPv//tt9/6xjf+6Ic/+v75+VlZliJirTXGlGVZ/dNsP3JFcfT0O975vvd95H3v +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 rkJggg== --------------050000050903010104050202 Content-Type: text/x-patch; name="font_debug_bug15876.patch" Content-Transfer-Encoding: 7bit Content-Disposition: attachment; filename="font_debug_bug15876.patch" === modified file 'src/alloc.c' --- src/alloc.c 2013-12-01 22:33:13 +0000 +++ src/alloc.c 2013-12-05 06:10:49 +0000 @@ -2877,7 +2877,12 @@ if (PSEUDOVECTOR_TYPEP (&vector->header, PVEC_FONT) && ((vector->header.size & PSEUDOVECTOR_SIZE_MASK) == FONT_OBJECT_MAX)) - ((struct font *) vector)->driver->close ((struct font *) vector); + { + if (((struct font *) vector)->debug) + fprintf (stderr, "GC%ld: free interesting font %p\n", + gcs_done, vector); + ((struct font *) vector)->driver->close ((struct font *) vector); + } } /* Reclaim space used by unmarked vectors. */ @@ -5733,6 +5738,14 @@ if (size & PSEUDOVECTOR_FLAG) size &= PSEUDOVECTOR_SIZE_MASK; + if (FONT_OBJECT_P (make_lisp_ptr (ptr, Lisp_Vectorlike))) + { + struct font *f = (struct font *) ptr; + if (f->debug) + fprintf (stderr, "GC%ld: mark interesting font %p\n", + gcs_done, f); + } + /* Note that this size is not the memory-footprint size, but only the number of Lisp_Object fields that we should trace. The distinction is used e.g. by Lisp_Process which places extra === modified file 'src/font.c' --- src/font.c 2013-12-04 13:08:30 +0000 +++ src/font.c 2013-12-05 06:00:56 +0000 @@ -188,6 +188,7 @@ int i; XSETFONT (font_object, font); + font->debug = 0; if (! NILP (entity)) { @@ -196,6 +197,7 @@ if (! NILP (AREF (entity, FONT_EXTRA_INDEX))) font->props[FONT_EXTRA_INDEX] = Fcopy_alist (AREF (entity, FONT_EXTRA_INDEX)); + font->props[FONT_ENTITY_INDEX] = entity; } if (size > 0) font->props[FONT_SIZE_INDEX] = make_number (pixelsize); @@ -4189,7 +4191,7 @@ the consecutive wildcards are folded into one. */) (Lisp_Object font, Lisp_Object fold_wildcards) { - char name[256]; + char name[256 + 32]; int namelen, pixel_size = 0; CHECK_FONT (font); @@ -4202,7 +4204,11 @@ && SDATA (font_name)[0] == '-') { if (NILP (fold_wildcards)) - return font_name; + { + XFONT_OBJECT (font)->debug = 1; + return make_formatted_string + (name, "%s (%p)", SSDATA (font_name), XFONT_OBJECT (font)); + } strcpy (name, SSDATA (font_name)); namelen = SBYTES (font_name); goto done; === modified file 'src/font.h' --- src/font.h 2013-12-04 13:35:41 +0000 +++ src/font.h 2013-12-05 05:59:31 +0000 @@ -285,6 +285,8 @@ /* Beyond here, there should be no more Lisp_Object components. */ + int debug; + /* Minimum and maximum glyph widths, in pixels. Some font backends, such as xft, lack the information to easily compute minimum and maximum widths over all characters; in that case, these values --------------050000050903010104050202--