From 0b0e0cbc947e357c8053c2837622094b00a422d5 Mon Sep 17 00:00:00 2001 From: Manuel Giraud Date: Mon, 25 Nov 2024 17:04:03 +0100 Subject: [PATCH] An on-disk image modification does a cache miss * src/dispextern.h: Add modification time to an image. * src/image.c (make_image): Get the modification time from the image file. (lookup_image): Make a modified image on disk results in a cache miss. * lisp/startup.el (fancy-splash-head): Remove a non full-path image file spec (XXX is there more?). --- lisp/startup.el | 2 +- src/dispextern.h | 4 ++++ src/image.c | 26 ++++++++++++++++++++++++++ 3 files changed, 31 insertions(+), 1 deletion(-) diff --git a/lisp/startup.el b/lisp/startup.el index 3436409a35e..42f6e70f05d 100644 --- a/lisp/startup.el +++ b/lisp/startup.el @@ -1957,7 +1957,7 @@ fancy-splash-image-file (defun fancy-splash-head () "Insert the head part of the splash screen into the current buffer." (let* ((image-file (fancy-splash-image-file)) - (img (create-image image-file)) + (img (create-image (image-search-load-path image-file))) (image-width (and img (car (image-size img)))) (window-width (window-width))) (when img diff --git a/src/dispextern.h b/src/dispextern.h index 9df6eaf623a..0f91568db99 100644 --- a/src/dispextern.h +++ b/src/dispextern.h @@ -3170,6 +3170,10 @@ reset_mouse_highlight (Mouse_HLInfo *hlinfo) in prepare_image_for_display. */ struct timespec timestamp; + /* The modification time of the file of this image. Set in + make_image. */ + struct timespec mtime; + /* Pixmaps of the image. */ Emacs_Pixmap pixmap, mask; diff --git a/src/image.c b/src/image.c index db7f6acd171..c5bddaf5985 100644 --- a/src/image.c +++ b/src/image.c @@ -37,6 +37,7 @@ Copyright (C) 1989-2024 Free Software Foundation, Inc. #include #include #include +#include #include "lisp.h" #include "frame.h" @@ -1744,6 +1745,7 @@ make_image (Lisp_Object spec, EMACS_UINT hash) { struct image *img = xzalloc (sizeof *img); Lisp_Object file = image_spec_value (spec, QCfile, NULL); + struct stat st; eassert (valid_image_p (spec)); img->dependencies = NILP (file) ? Qnil : list1 (file); @@ -1754,6 +1756,9 @@ make_image (Lisp_Object spec, EMACS_UINT hash) img->ascent = DEFAULT_IMAGE_ASCENT; img->hash = hash; img->corners[BOT_CORNER] = -1; /* Full image */ + /* Retrieve file mtime. */ + if (! NILP (file) && (emacs_fstatat (AT_FDCWD, SSDATA (file), &st, 0) == 0)) + img->mtime = get_stat_mtime (&st); return img; } @@ -3513,6 +3518,27 @@ lookup_image (struct frame *f, Lisp_Object spec, int face_id) img = NULL; } + /* If the on-disk image file has changed, this is also a cache + miss. */ + if (img) + { + Lisp_Object file; + bool found; + + file = image_spec_value (spec, QCfile, &found); + if (found && STRINGP (file)) + { + struct stat st; + + if (emacs_fstatat (AT_FDCWD, SSDATA (file), &st, 0) != 0 + || timespec_cmp (get_stat_mtime (&st), img->mtime) != 0) + { + free_image (f, img); + img = NULL; + } + } + } + /* If not found, create a new image and cache it. */ if (img == NULL) { -- 2.47.0