diff options
| author | Craig Jennings <c@cjennings.net> | 2026-05-16 11:28:25 -0500 |
|---|---|---|
| committer | Craig Jennings <c@cjennings.net> | 2026-05-16 11:28:25 -0500 |
| commit | b35d10bae7315fe3e497f1188bbe5ce86cef1bbf (patch) | |
| tree | fc5af20dff74064e9578d2ba2ca03c7e8f0ac6e8 /modules/config-utilities.el | |
| parent | 63ae6e683d5166f744e8e7d45fe9a02d8a145088 (diff) | |
| download | dotemacs-b35d10bae7315fe3e497f1188bbe5ce86cef1bbf.tar.gz dotemacs-b35d10bae7315fe3e497f1188bbe5ce86cef1bbf.zip | |
fix(config-utilities): guard emacsql-close against nil sqlite handle
EmacSQL 4.3.1 registers a finalizer per connection that calls
emacsql-close after GC. The sqlite-builtin and sqlite-module backends
clear their handle slot during an explicit close, so the finalizer
later runs emacsql-close on a closed connection and sqlite-close fires:
finalizer failed: (wrong-type-argument sqlitep nil)
Adds an :around method on emacsql-close for both backends that
short-circuits when the handle is already nil. Requires cl-generic
and eieio at the top of the file so the cl-defmethod forms expand.
Diffstat (limited to 'modules/config-utilities.el')
| -rw-r--r-- | modules/config-utilities.el | 20 |
1 files changed, 20 insertions, 0 deletions
diff --git a/modules/config-utilities.el b/modules/config-utilities.el index 8d094fda..4ed086d1 100644 --- a/modules/config-utilities.el +++ b/modules/config-utilities.el @@ -7,6 +7,8 @@ ;;; Code: (require 'cl-lib) +(require 'cl-generic) +(require 'eieio) (require 'find-lisp) (require 'profiler) @@ -45,6 +47,24 @@ (keymap-set cj/debug-config-keymap "t" #'toggle-debug-on-error) +;;; ----------------------------- Package Workarounds -------------------------- + +;; EmacSQL 4.3.1 registers finalizers that call `emacsql-close'. The sqlite +;; backends set their handle slot to nil after an explicit close, so a later +;; finalizer can otherwise call `sqlite-close' with nil and log: +;; finalizer failed: (wrong-type-argument sqlitep nil) +(with-eval-after-load 'emacsql-sqlite-builtin + (cl-defmethod emacsql-close :around + ((connection emacsql-sqlite-builtin-connection)) + (when (oref connection handle) + (cl-call-next-method)))) + +(with-eval-after-load 'emacsql-sqlite-module + (cl-defmethod emacsql-close :around + ((connection emacsql-sqlite-module-connection)) + (when (oref connection handle) + (cl-call-next-method)))) + ;;; -------------------------------- Benchmarking ------------------------------- (defmacro with-timer (title &rest forms) |
