From mboxrd@z Thu Jan 1 00:00:00 1970 Path: news.gmane.org!not-for-mail From: Chong Yidong Newsgroups: gmane.emacs.devel Subject: Re: Memory leak in keyboard variables? Date: Sun, 14 Dec 2008 22:16:05 -0500 Message-ID: <87oczeuo0a.fsf@cyd.mit.edu> References: NNTP-Posting-Host: lo.gmane.org Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii X-Trace: ger.gmane.org 1229312718 539 80.91.229.12 (15 Dec 2008 03:45:18 GMT) X-Complaints-To: usenet@ger.gmane.org NNTP-Posting-Date: Mon, 15 Dec 2008 03:45:18 +0000 (UTC) Cc: emacs-devel@gnu.org To: Kenichi Handa Original-X-From: emacs-devel-bounces+ged-emacs-devel=m.gmane.org@gnu.org Mon Dec 15 04:46:20 2008 Return-path: Envelope-to: ged-emacs-devel@m.gmane.org Original-Received: from lists.gnu.org ([199.232.76.165]) by lo.gmane.org with esmtp (Exim 4.50) id 1LC4PS-0003bH-1G for ged-emacs-devel@m.gmane.org; Mon, 15 Dec 2008 04:46:18 +0100 Original-Received: from localhost ([127.0.0.1]:59390 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.43) id 1LC4OF-0004YL-Ue for ged-emacs-devel@m.gmane.org; Sun, 14 Dec 2008 22:45:04 -0500 Original-Received: from mailman by lists.gnu.org with tmda-scanned (Exim 4.43) id 1LC3wA-0006PH-AO for emacs-devel@gnu.org; Sun, 14 Dec 2008 22:16:02 -0500 Original-Received: from exim by lists.gnu.org with spam-scanned (Exim 4.43) id 1LC3w9-0006OU-Be for emacs-devel@gnu.org; Sun, 14 Dec 2008 22:16:01 -0500 Original-Received: from [199.232.76.173] (port=48412 helo=monty-python.gnu.org) by lists.gnu.org with esmtp (Exim 4.43) id 1LC3w8-0006OA-St for emacs-devel@gnu.org; Sun, 14 Dec 2008 22:16:01 -0500 Original-Received: from cyd.mit.edu ([18.115.2.24]:40680) by monty-python.gnu.org with esmtp (Exim 4.60) (envelope-from ) id 1LC3w8-0005Em-Iy for emacs-devel@gnu.org; Sun, 14 Dec 2008 22:16:00 -0500 Original-Received: by cyd.mit.edu (Postfix, from userid 1000) id 04B9057E195; Sun, 14 Dec 2008 22:16:06 -0500 (EST) In-Reply-To: (Kenichi Handa's message of "Mon, 15 Dec 2008 10:26:05 +0900") User-Agent: Gnus/5.13 (Gnus v5.13) Emacs/23.0.60 (gnu/linux) X-detected-operating-system: by monty-python.gnu.org: Genre and OS details not recognized. X-BeenThere: emacs-devel@gnu.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: "Emacs development discussions." List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Original-Sender: emacs-devel-bounces+ged-emacs-devel=m.gmane.org@gnu.org Errors-To: emacs-devel-bounces+ged-emacs-devel=m.gmane.org@gnu.org Xref: news.gmane.org gmane.emacs.devel:106921 Archived-At: Kenichi Handa writes: > The strategy is to record all font-objects in font-entities, and > record all font-entities in a cache of each font-backend. The caches > are freed when `delete-frame' calls font_update_drivers with > new_drivers as nil Thanks for the explanation. It was very helpful. I think the problem is that font_clear_cache is incorrectly written. For some reason, it assumes that the font cache entries have the form (font-spec [entity1 entity2...]) when in fact, they have the form (font-spec entity1 entity2...) The following patch to font_clear_cache frees 60-70k of memory per terminal. Do you know why font_clear_cache was written this way, and whether there could be any other places in the font code that make this incorrect assumption? *** trunk/src/font.c.~1.99.~ 2008-12-13 10:39:30.000000000 -0500 --- trunk/src/font.c 2008-12-14 22:06:26.000000000 -0500 *************** *** 2651,2671 **** struct font_driver *driver; { Lisp_Object tail, elt; /* CACHE = (DRIVER-TYPE NUM-FRAMES FONT-CACHE-DATA ...) */ for (tail = XCDR (XCDR (cache)); CONSP (tail); tail = XCDR (tail)) { elt = XCAR (tail); ! if (CONSP (elt) && FONT_SPEC_P (XCAR (elt)) && VECTORP (XCDR (elt))) { ! Lisp_Object vec = XCDR (elt); ! int i; ! ! for (i = 0; i < ASIZE (vec); i++) { ! Lisp_Object entity = AREF (vec, i); ! if (EQ (driver->type, AREF (entity, FONT_TYPE_INDEX))) { Lisp_Object objlist = AREF (entity, FONT_OBJLIST_INDEX); --- 2651,2671 ---- struct font_driver *driver; { Lisp_Object tail, elt; + Lisp_Object tail2, entity; /* CACHE = (DRIVER-TYPE NUM-FRAMES FONT-CACHE-DATA ...) */ for (tail = XCDR (XCDR (cache)); CONSP (tail); tail = XCDR (tail)) { elt = XCAR (tail); ! /* elt should have the form (FONT-SPEC FONT-ENTITY ...) */ ! if (CONSP (elt) && FONT_SPEC_P (XCAR (elt))) { ! for (tail2 = XCDR (elt); CONSP (tail2); tail2 = XCDR (tail2)) { ! entity = XCAR (tail2); ! if (FONT_ENTITY_P (entity) ! && EQ (driver->type, AREF (entity, FONT_TYPE_INDEX))) { Lisp_Object objlist = AREF (entity, FONT_OBJLIST_INDEX);