From cef02cf775e530ff3402b2a8d28c6e8d97c32c70 Mon Sep 17 00:00:00 2001 From: ckonstanski Date: Mon, 1 Dec 2025 12:12:04 -0700 Subject: [INF-18346] Impove error handling to prevent thread death --- lisp/condition/condition.lisp | 7 ------- lisp/queue/queue.lisp | 44 +++++++++++++++++++++++++------------------ lisp/snow.asd | 7 ++----- 3 files changed, 28 insertions(+), 30 deletions(-) delete mode 100644 lisp/condition/condition.lisp (limited to 'lisp') diff --git a/lisp/condition/condition.lisp b/lisp/condition/condition.lisp deleted file mode 100644 index d0bad15..0000000 --- a/lisp/condition/condition.lisp +++ /dev/null @@ -1,7 +0,0 @@ -;;; -*- Mode: Lisp; Syntax: ANSI-Common-Lisp; Base: 10 -*- -(declaim (optimize (speed 0) (safety 3) (debug 3))) - -(in-package :snow) - -(define-condition handled-error (error) - ((text :initarg :text :reader text))) diff --git a/lisp/queue/queue.lisp b/lisp/queue/queue.lisp index da86f6c..ecd517f 100644 --- a/lisp/queue/queue.lisp +++ b/lisp/queue/queue.lisp @@ -62,26 +62,34 @@ names. The string is a SHA1 hash." (process-thread-function symbol-queue-name process-thread-name sleep-interval))))) (defun process-thread-function (symbol-queue-name process-thread-name sleep-interval) - (with-error-handled-thread (process-thread-name :warning) + (without-error-handled-thread (process-thread-name :warning) (labels ((do-dequeue () (dequeue (eval symbol-queue-name))) (do-process (object) (bg-perform object)) (do-sleep () - (sleep sleep-interval))) - (loop - (let (object - do-process-p - do-sleep-p) - (sb-thread:with-mutex (*queue-mutex*) - (cond ((empty-p (eval symbol-queue-name)) - (setf do-sleep-p t)) - (t - (setf object (do-dequeue)) - (if object - (setf do-process-p t) - (setf do-sleep-p t))))) - (when do-sleep-p - (do-sleep)) - (when (and do-process-p object) - (do-process object))))))) + (sleep sleep-interval)) + (do-loop () + (handler-case + (loop + (let (object + do-process-p + do-sleep-p) + (sb-thread:with-mutex (*queue-mutex*) + (cond ((empty-p (eval symbol-queue-name)) + (setf do-sleep-p t)) + (t + (setf object (do-dequeue)) + (if object + (setf do-process-p t) + (setf do-sleep-p t))))) + (when do-sleep-p + (do-sleep)) + (when (and do-process-p object) + (do-process object)))) + (error (e) + (org-ckons-core::logger e) + (unless hunchentoot:*catch-errors-p* + (invoke-debugger e)) + (do-loop))))) + (do-loop)))) diff --git a/lisp/snow.asd b/lisp/snow.asd index 741a1d0..b8624c3 100644 --- a/lisp/snow.asd +++ b/lisp/snow.asd @@ -18,7 +18,7 @@ :components ,components)) (defparameter *quicklisp-packages* '(net-telent-date simple-date local-time cl-ppcre uffi hunchentoot cl-log ironclad)) -(defparameter *asdf-packages* '(org-ckons-core org-ckons-condition org-ckons-http org-ckons-json org-ckons-file org-ckons-session)) +(defparameter *asdf-packages* '(org-ckons-core org-ckons-http org-ckons-json org-ckons-file org-ckons-session)) (defparameter *all-packages* (append *quicklisp-packages* *asdf-packages*)) (loop for pkg in *quicklisp-packages* do @@ -33,11 +33,8 @@ :depends-on *all-packages* :components ((:module core :components ((:file "core"))) - (:module condition - :depends-on (core) - :components ((:file "condition"))) (:module queue - :depends-on (condition) + :depends-on (core) :components ((:file "fifo") (:file "queue" :depends-on ("fifo")))) (:module git -- cgit v1.3