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 | 04afd842c0192c105eee8e106beebc9bba6ceba0 (patch) | |
| tree | 4ed5f9c2634b21a119ff4d8ae7ee6890395fb87f /modules/config-utilities.el | |
| parent | da74eceffe35f235a6810bd4342a6d00f70ee2d9 (diff) | |
| download | dotemacs-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/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 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) |
