aboutsummaryrefslogtreecommitdiff
path: root/modules
diff options
context:
space:
mode:
authorCraig Jennings <c@cjennings.net>2026-05-16 11:28:25 -0500
committerCraig Jennings <c@cjennings.net>2026-05-16 11:28:25 -0500
commit04afd842c0192c105eee8e106beebc9bba6ceba0 (patch)
tree4ed5f9c2634b21a119ff4d8ae7ee6890395fb87f /modules
parentda74eceffe35f235a6810bd4342a6d00f70ee2d9 (diff)
downloaddotemacs-04afd842c0192c105eee8e106beebc9bba6ceba0.tar.gz
dotemacs-04afd842c0192c105eee8e106beebc9bba6ceba0.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')
-rw-r--r--modules/config-utilities.el20
1 files changed, 20 insertions, 0 deletions
diff --git a/modules/config-utilities.el b/modules/config-utilities.el
index 8d094fda9..4ed086d17 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)