From mboxrd@z Thu Jan 1 00:00:00 1970 Path: news.gmane.io!.POSTED.blaine.gmane.org!not-for-mail From: Po Lu via "Bug reports for GNU Emacs, the Swiss army knife of text editors" Newsgroups: gmane.emacs.bugs Subject: bug#71929: 30.0.60; crash in mark_image_cache Date: Sun, 07 Jul 2024 21:47:28 +0800 Message-ID: <871q452u1b.fsf@yahoo.com> References: <87jzi17uot.fsf@melete.silentflame.com> <87y16h6fm3.fsf@melete.silentflame.com> <86jzi1aeje.fsf@gnu.org> <86ikxlae3p.fsf@gnu.org> <87tth4ofvp.fsf@melete.silentflame.com> <86jzi073r8.fsf@gnu.org> <871q4849yc.fsf@yahoo.com> <86frso70i4.fsf@gnu.org> <87wmm02n9q.fsf@yahoo.com> <867ce06qnf.fsf@gnu.org> <87sewo2hk3.fsf@yahoo.com> <87cynrjl84.fsf@melete.silentflame.com> <87o77b2gsr.fsf@yahoo.com> <87tth1rkfy.fsf@melete.silentflame.com> <87plrprkb2.fsf@melete.silentflame.com> <87frsl3l0p.fsf@yahoo.com> <87plrpvm2y.fsf@melete.silentflame.com> <86a5it3cj2.fsf@gnu.org> <875xth3aym.fsf@yahoo.com> <87ed851gwv.fsf@melete.silentflame.com> Reply-To: Po Lu Mime-Version: 1.0 Content-Type: text/plain Injection-Info: ciao.gmane.io; posting-host="blaine.gmane.org:116.202.254.214"; logging-data="33137"; mail-complaints-to="usenet@ciao.gmane.io" User-Agent: Gnus/5.13 (Gnus v5.13) Cc: 71929@debbugs.gnu.org, Eli Zaretskii To: Sean Whitton Original-X-From: bug-gnu-emacs-bounces+geb-bug-gnu-emacs=m.gmane-mx.org@gnu.org Sun Jul 07 15:49:18 2024 Return-path: Envelope-to: geb-bug-gnu-emacs@m.gmane-mx.org Original-Received: from lists.gnu.org ([209.51.188.17]) by ciao.gmane.io with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.92) (envelope-from ) id 1sQSGU-0008Qj-34 for geb-bug-gnu-emacs@m.gmane-mx.org; Sun, 07 Jul 2024 15:49:18 +0200 Original-Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1sQSGC-0008TF-NS; Sun, 07 Jul 2024 09:49:00 -0400 Original-Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1sQSGB-0008Sx-56 for bug-gnu-emacs@gnu.org; Sun, 07 Jul 2024 09:48:59 -0400 Original-Received: from debbugs.gnu.org ([2001:470:142:5::43]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1sQSGA-0001t0-T7 for bug-gnu-emacs@gnu.org; Sun, 07 Jul 2024 09:48:58 -0400 Original-Received: from Debian-debbugs by debbugs.gnu.org with local (Exim 4.84_2) (envelope-from ) id 1sQSGE-00080y-6m for bug-gnu-emacs@gnu.org; Sun, 07 Jul 2024 09:49:02 -0400 X-Loop: help-debbugs@gnu.org Resent-From: Po Lu Original-Sender: "Debbugs-submit" Resent-CC: bug-gnu-emacs@gnu.org Resent-Date: Sun, 07 Jul 2024 13:49:02 +0000 Resent-Message-ID: Resent-Sender: help-debbugs@gnu.org X-GNU-PR-Message: followup 71929 X-GNU-PR-Package: emacs Original-Received: via spool by 71929-submit@debbugs.gnu.org id=B71929.172036008830723 (code B ref 71929); Sun, 07 Jul 2024 13:49:02 +0000 Original-Received: (at 71929) by debbugs.gnu.org; 7 Jul 2024 13:48:08 +0000 Original-Received: from localhost ([127.0.0.1]:47582 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1sQSFL-0007zS-K5 for submit@debbugs.gnu.org; Sun, 07 Jul 2024 09:48:08 -0400 Original-Received: from sonic317-32.consmr.mail.ne1.yahoo.com ([66.163.184.43]:35846) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1sQSFI-0007yu-Um for 71929@debbugs.gnu.org; Sun, 07 Jul 2024 09:48:05 -0400 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=yahoo.com; s=s2048; t=1720360073; bh=CviHZ3iTYnyULXGvjhUL7QxKEj7Mtf/pzW29bZfxxdw=; h=From:To:Cc:Subject:In-Reply-To:References:Date:From:Subject:Reply-To; b=TQ5QAT7muOWzmJv939Iwo3M+jjDUzja+54twUSUvF5IUz6IBFVZ0NvlxkmoC1t53vxEbSn3O5+2HaqTF7WAAdXMcDPevj/Qbl6+w/eSZwex6Qpa14qnAR7hOoE30DPB5obAkaAwmjq7Pxtj2d4We/9kUwrKmt7vZMz6gshMWUVjM/vws82iICJaHWZVV5/yL9xeZh6vPuh7d2MfRwJDjJbflsfbDI0T7IOiXEFlW6FcRdjONeJj9sRsFjNvVshv9zXNwF10f2np3u+Bc/I/EQ1nZgN4zVpKM4WevjRQzKHOqdn7lPhqGYinjDGPnXxncYLeQdCuoBEkTm0CBe2SIsg== X-SONIC-DKIM-SIGN: v=1; a=rsa-sha256; c=relaxed/relaxed; d=yahoo.com; s=s2048; t=1720360073; bh=/6WSjJkb/nYS6lHB9GHzYB4V0KOHltXtP7aLaBCEpeG=; h=X-Sonic-MF:From:To:Subject:Date:From:Subject; b=HNvQ/Bvcb7p691exwaSQ6C5e0zqI64FdZijp8+O4bRZJrlB5IAHjE/THyuA7d4rAp/kLEa1exlZP8YsPuBzjBem5U0QTEcRgWhrKPFh4jp4sJamU4pqf365iprWUgy+SXHGJPBu5COvU+wySB9OJt0ZNZn4R842Kx0AylcJArmKcvOtulKfQyKHAQ90AiW43RjC6cQ1u0oszUA5BxR+tOLm9dK6utWcSVBjmsHEl2TVc7P+CjzSgd0frf/uMyygpX0JD66CWoGyGRiCZ0+K6phkiA72BMdp/PYtRNrCPOicatmk0b8jYp+uN3v+xs1UdNTh/uc+GAMj936cC4SqUkQ== X-YMail-OSG: Md.yjl0VM1n9ZgiajGljWnRaFB.mUWnIpZ4wV2E6a0qkuAh9uLcKUL6_UCdZL71 shHmwR29NzQU0RCqJKY8UhZ_8IJba3efTPUK458T69su5mCkdskgrmeknEzEH6wo8KzTo3KiQuzh QJVjmehasx9haco0Z8l7aJ0.l28gjkCdR7Lmw4eCWZ.0Ra_VTJVmnbJiilYkgP2OTcZwzqiAA6J. 8NAYIOXBK1WCAtFlU1vFN7FaPcAWaHHysDFNBKj50KmDg91raR6VD_.qCnWX6MENYyEpJxJHB8jy 0fLgBN6GDQ.C7hW8WIszc5MyOhOHOC5vyJPfKfubqpkwZRSA5HPRjRfz9P50imvTockTsnCHDpdR 6_uMeR3ELThGLIpbeXPSVfJi_4Td6L9MQC6GrwJDJL_oExby6iCnuXWkonQ4A88_ya3E7y897gEi Sfvh67YDOsrHF1ZlihinmtM3IkN7KKec0QDdAUvVy2i7XOpu7UMruHSi4glWtvRjiPBtV6wmmoTt _0hybdcatsGEETYEFjB9zqP7fYVNyT9ZUrrbp4E9n8Hl4b5sZS6or6WB5NaopRgmGO2wwqgm4yJc NyryuSxTxYAiEX3GSUR_rs_nWqlaFFUAwwqmkjNrtxCUul0sZslNmKHNqOyAgD0UhQ7Bgme6eKj1 6j0L60KWDW559nkMgRDsI2_N7XPVNYKKEEdImXEzpU1IIolk_jhDDEfnrhxaCw8ZikS6g1famzhr YLjBS4o7rWBphlK.R7VFp_Dl05mUJzRl19cgKuYccMVic0qHoirU7HDNpwt9f44TPa9gDjXbT6Rd eRJ8goq_ZoPV6yvnCvWDX_XLk7EpuK8X8HGzfYKFI9 X-Sonic-MF: X-Sonic-ID: ba85a183-9a75-4a27-8595-2c2c58507f92 Original-Received: from sonic.gate.mail.ne1.yahoo.com by sonic317.consmr.mail.ne1.yahoo.com with HTTP; Sun, 7 Jul 2024 13:47:53 +0000 Original-Received: by hermes--production-sg3-7b469d9f6-2fcg5 (Yahoo Inc. Hermes SMTP Server) with ESMTPA ID 560c21bdee3602f26d10f2a13d99eae5; Sun, 07 Jul 2024 13:47:49 +0000 (UTC) In-Reply-To: <87ed851gwv.fsf@melete.silentflame.com> (Sean Whitton's message of "Sun, 07 Jul 2024 21:16:16 +0800") X-Mailer: WebService/1.1.22464 mail.backend.jedi.jws.acl:role.jedi.acl.token.atz.jws.hermes.yahoo X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list 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-mx.org@gnu.org Original-Sender: bug-gnu-emacs-bounces+geb-bug-gnu-emacs=m.gmane-mx.org@gnu.org Xref: news.gmane.io gmane.emacs.bugs:288559 Archived-At: Sean Whitton writes: > Hello, > > On Sun 07 Jul 2024 at 03:41pm +08, Po Lu wrote: > >> Eli Zaretskii writes: >> >>> This is the initial frame of the daemon. It is not a GUI frame, and >>> so it should not have a valid image cache. I guess some change is >>> needed in verify_image_cache_refcount? >> >> Not quite: init_frame_faces is apparently called before the frame is >> entered into Vframe_list, so, likewise, the face cache's reference count >> should be verified before it is incremented. >> >> Sean, please retry with this patch substituted for the previous: > > This time it doesn't crash until I open and close a frame, as can be > seen in the backtrace: I must ask you to bear with me again, as another detail was not correctly accounted for in the last patch. Please retry with this: diff --git a/src/frame.c b/src/frame.c index 7f4bf274ad9..9793b9f5cbe 100644 --- a/src/frame.c +++ b/src/frame.c @@ -4831,14 +4831,20 @@ gui_set_font (struct frame *f, Lisp_Object arg, Lisp_Object oldval) /* Clean F's image cache of images whose values are derived from the font width. */ clear_image_cache (f, Qauto); + verify_image_cache_refcount (FRAME_IMAGE_CACHE (f)); } else { + struct image_cache *old_cache = FRAME_IMAGE_CACHE (f); + /* Release the current image cache, and reuse or allocate a new image cache with IWIDTH. */ FRAME_IMAGE_CACHE (f)->refcount--; + FRAME_IMAGE_CACHE (f) = NULL; + verify_image_cache_refcount (old_cache); FRAME_IMAGE_CACHE (f) = share_image_cache (f); FRAME_IMAGE_CACHE (f)->refcount++; + verify_image_cache_refcount (FRAME_IMAGE_CACHE (f)); } } diff --git a/src/frame.h b/src/frame.h index 1d920d1a6bc..8a636c56643 100644 --- a/src/frame.h +++ b/src/frame.h @@ -1682,6 +1682,31 @@ IMAGE_OPT_FROM_ID (struct frame *f, int id) eassume (0 <= used); return 0 <= id && id < used ? FRAME_IMAGE_CACHE (f)->images[id] : NULL; } + +/* Abort if C is non-NULL and C's `refcount' field disagrees with the + number of frames holding references to the same. */ + +INLINE void +verify_image_cache_refcount (struct image_cache *c) +{ + int expected; + Lisp_Object tail, frame; + + if (c) + { + expected = 0; + + FOR_EACH_FRAME (tail, frame) + { + if (FRAME_IMAGE_CACHE (XFRAME (frame)) == c) + expected++; + } + + if (expected != c->refcount) + emacs_abort (); + } +} + #endif /*********************************************************************** diff --git a/src/image.c b/src/image.c index 2945447b962..9387c78408b 100644 --- a/src/image.c +++ b/src/image.c @@ -3625,6 +3625,7 @@ cache_image (struct frame *f, struct image *img) { c = FRAME_IMAGE_CACHE (f) = share_image_cache (f); c->refcount++; + verify_image_cache_refcount (c); } /* Find a free slot in c->images. */ diff --git a/src/xfaces.c b/src/xfaces.c index 188dd4778bc..372c36634d1 100644 --- a/src/xfaces.c +++ b/src/xfaces.c @@ -678,7 +678,10 @@ init_frame_faces (struct frame *f) /* Make or share an image cache. */ if (FRAME_WINDOW_P (f)) { - FRAME_IMAGE_CACHE (f) = share_image_cache (f); + struct image_cache *c = share_image_cache (f); + + verify_image_cache_refcount (c); + FRAME_IMAGE_CACHE (f) = c; ++FRAME_IMAGE_CACHE (f)->refcount; } #endif /* HAVE_WINDOW_SYSTEM */ @@ -710,6 +713,7 @@ free_frame_faces (struct frame *f) if (image_cache) { --image_cache->refcount; + verify_image_cache_refcount (image_cache); if (image_cache->refcount == 0) free_image_cache (f); }