emacs-elpa-diffs
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[elpa] externals/org 79971b7: org-element.el: Prevent cache key collisio


From: ELPA Syncer
Subject: [elpa] externals/org 79971b7: org-element.el: Prevent cache key collisions
Date: Thu, 21 Oct 2021 11:57:43 -0400 (EDT)

branch: externals/org
commit 79971b748df36c3b48455965123e3fab8075b07f
Author: Ihor Radchenko <yantar92@gmail.com>
Commit: Ihor Radchenko <yantar92@gmail.com>

    org-element.el: Prevent cache key collisions
    
    * lisp/org-element.el (org-element--cache-sync,
    org-element-cache-reset): Do not use `buffer-chars-modified-tick' as
    `org-element--cache-sync-keys-value'.  Instead, make sure that
    `org-element--cache-sync-keys-value' is always changed upon completing
    cache request sequence.  Using `buffer-chars-modified-tick' can
    trigger using obsolete sync keys after we add elements to cache via
    `org-element--parse-to' after cache sync is completed, but no other
    changes were made in the buffer.  The newly added elements are then
    not comparable with the obsolete sync keys.
    
    (org-element--cache-persist-before-write): Cleanup
    `:org-element--cache-sync-key' from elements before saving element
    cache to file.  If we do not do it, obsolete keys may be reused
    inintentionally during next Emacs session.
---
 lisp/org-element.el | 10 ++++++++--
 1 file changed, 8 insertions(+), 2 deletions(-)

diff --git a/lisp/org-element.el b/lisp/org-element.el
index ca9ba67..9b994b8 100644
--- a/lisp/org-element.el
+++ b/lisp/org-element.el
@@ -5843,7 +5843,7 @@ updated before current modification are actually 
submitted."
          ;; Otherwise, reset keys.
          (if org-element--cache-sync-requests
              (org-element--cache-set-timer buffer)
-            (setq org-element--cache-sync-keys-value 
(buffer-chars-modified-tick))))))))
+            (setq org-element--cache-sync-keys-value (1+ 
org-element--cache-sync-keys-value))))))))
 
 (defun org-element--cache-process-request
     (request next-request-key threshold time-limit future-change)
@@ -6819,6 +6819,12 @@ Return non-nil when verification failed."
              org-element-cache-persistent
              (eq var 'org-element--cache))
     (with-current-buffer buffer
+      ;; Cleanup cache request keys to avoid collisions during next
+      ;; Emacs session.
+      (avl-tree-mapc
+       (lambda (el)
+         (org-element-put-property el :org-element--cache-sync-key nil))
+       org-element--cache)
       (org-with-wide-buffer
        (org-element-at-point (point-max))))
     nil))
@@ -6872,7 +6878,7 @@ buffers."
                    (avl-tree-create #'org-element--cache-compare))
         (setq-local org-element--cache-size 0)
         (setq-local org-element--headline-cache-size 0)
-       (setq-local org-element--cache-sync-keys-value 
(buffer-chars-modified-tick))
+       (setq-local org-element--cache-sync-keys-value 0)
        (setq-local org-element--cache-change-warning nil)
        (setq-local org-element--cache-sync-requests nil)
        (setq-local org-element--cache-sync-timer nil)



reply via email to

[Prev in Thread] Current Thread [Next in Thread]