diff --git a/jupyter-client.el b/jupyter-client.el index 536f3ac..6e1b3a7 100644 --- a/jupyter-client.el +++ b/jupyter-client.el @@ -196,6 +196,13 @@ passed as the argument has a language of LANG." (set-buffer-modified-p nil)) (kill-buffer (oref client -buffer)))) +(defun jupyter-kill-kernel-clients () + "Call the destructor for all live Jupyter clients." + (dolist (client jupyter--clients) + (destructor client))) + +(add-hook 'kill-emacs-hook 'jupyter-kill-kernel-clients) + (defun jupyter-find-client-for-session (session-id) "Return the `jupyter-kernel-client' for SESSION-ID." (or (catch 'found diff --git a/jupyter-kernel-manager.el b/jupyter-kernel-manager.el index d48f778..3a73a56 100644 --- a/jupyter-kernel-manager.el +++ b/jupyter-kernel-manager.el @@ -37,8 +37,13 @@ "Jupyter kernel manager" :group 'jupyter) -(defclass jupyter-kernel-manager () - ((name +(defvar jupyter--managers nil + "A list of all live kernel managers. +Managers are removed from this list when their `destructor' is called.") + +(defclass jupyter-kernel-manager (eieio-instance-tracker) + ((tracking-symbol :initform 'jupyter--managers) + (name :initarg :name :type string :documentation "The name of the kernel that is being managed.") @@ -81,8 +86,16 @@ default kernel is a python kernel." ;; See `jupyter--kernel-sentinel' for other cleanup (when (processp (oref manager kernel)) (delete-process (oref manager kernel))) + (delete-instance manager) (jupyter-stop-channels manager)) +(defun jupyter-kill-kernel-managers () + (dolist (manager jupyter--managers) + (jupyter-shutdown-kernel manager) + (destructor manager))) + +(add-hook 'kill-emacs-hook 'jupyter-kill-kernel-managers) + (cl-defgeneric jupyter-make-client ((manager jupyter-kernel-manager) class &rest slots) "Make a new client from CLASS connected to MANAGER's kernel. SLOTS are the slots used to initialize the client with.")