[bknr-cvs] hans changed trunk/thirdparty/hunchentoot/
BKNR Commits
bknr at bknr.net
Sun Mar 7 09:16:11 UTC 2010
Revision: 4518
Author: hans
URL: http://bknr.net/trac/changeset/4518
Debugging improved, patch supplied by Andrey Moskvitin.
Introduces a new parameter:
(defparameter *max-debugging-threads* 5
"Maximum number of simultaneous active calls invoke-debuger")
This can be used to limit the number of debuggers that can be opened
at once.
U trunk/thirdparty/hunchentoot/conditions.lisp
U trunk/thirdparty/hunchentoot/packages.lisp
U trunk/thirdparty/hunchentoot/specials.lisp
Modified: trunk/thirdparty/hunchentoot/conditions.lisp
===================================================================
--- trunk/thirdparty/hunchentoot/conditions.lisp 2010-02-26 11:39:21 UTC (rev 4517)
+++ trunk/thirdparty/hunchentoot/conditions.lisp 2010-03-07 09:16:10 UTC (rev 4518)
@@ -90,15 +90,55 @@
"Used to signal an error if an operation named NAME is not implemented."
(error 'operation-not-implemented :operation name))
+(defun kill-all-debugging-threads ()
+ "Used for destroy all debugging threads"
+ (with-lock-held (*debugging-threads-lock*)
+ (dolist (thread *debugging-threads*)
+ (when (ignore-errors
+ (bt:destroy-thread thread)
+ t)
+ (setf *debugging-threads*
+ (remove thread *debugging-threads*))))))
+
+(defun debug-mode-on ()
+ "Used to enable debug mode"
+ (setf *catch-errors-p* nil))
+
+(defun debug-mode-off (&optional (kill-debuging-threads t))
+ "Used to turn off debug mode"
+ (setf *catch-errors-p* t)
+ (when kill-debuging-threads
+ (kill-all-debugging-threads)))
+
+(defun after-close-swank-connection (connection)
+ "Turns off debug mode and destroy debugging threads after closing the connection with the swank-server"
+ (declare (ignore connection))
+ (debug-mode-off t))
+
+(when (find-package :swank)
+ (ignore-errors
+ (eval `(,(find-symbol (string '#:add-hook) :swank)
+ ,(find-symbol (string '#:*connection-closed-hook*) :swank)
+ 'after-close-swank-connection))))
+
(defgeneric maybe-invoke-debugger (condition)
(:documentation "This generic function is called whenever a
condition CONDITION is signaled in Hunchentoot. You might want to
specialize it on specific condition classes for debugging purposes.")
(:method (condition)
- "The default method invokes the debugger with CONDITION if
+ "The default method invokes the debugger with CONDITION if
*CATCH-ERRORS-P* is NIL."
- (unless *catch-errors-p*
- (invoke-debugger condition))))
+ (unless (or *catch-errors-p*
+ (< *max-debugging-threads*
+ (length *debugging-threads*)))
+ (let ((thread (bt:current-thread)))
+ (with-lock-held (*debugging-threads-lock*)
+ (push thread *debugging-threads*))
+ (unwind-protect
+ (invoke-debugger condition)
+ (with-lock-held (*debugging-threads-lock*)
+ (setf *debugging-threads*
+ (remove thread *debugging-threads*))))))))
(defmacro with-debugger (&body body)
"Executes BODY and invokes the debugger if an error is signaled and
Modified: trunk/thirdparty/hunchentoot/packages.lisp
===================================================================
--- trunk/thirdparty/hunchentoot/packages.lisp 2010-02-26 11:39:21 UTC (rev 4517)
+++ trunk/thirdparty/hunchentoot/packages.lisp 2010-03-07 09:16:10 UTC (rev 4518)
@@ -62,6 +62,7 @@
"*LOG-LISP-BACKTRACES-P*"
"*LOG-LISP-ERRORS-P*"
"*LOG-LISP-WARNINGS-P*"
+ "*MAX-DEBUGGING-THREADS*"
"*MESSAGE-LOG-PATHNAME*"
"*METHODS-FOR-POST-PARAMETERS*"
"*REPLY*"
@@ -264,5 +265,7 @@
"URL-DECODE"
"URL-ENCODE"
"USER-AGENT"
- "WITHIN-REQUEST-P"))
+ "WITHIN-REQUEST-P"
+ "DEBUG-MODE-ON"
+ "DEBUG-MODE-OFF"))
Modified: trunk/thirdparty/hunchentoot/specials.lisp
===================================================================
--- trunk/thirdparty/hunchentoot/specials.lisp 2010-02-26 11:39:21 UTC (rev 4517)
+++ trunk/thirdparty/hunchentoot/specials.lisp 2010-03-07 09:16:10 UTC (rev 4518)
@@ -236,6 +236,16 @@
"Whether Hunchentoot should catch and log errors \(or rather invoke
the debugger).")
+(defparameter *max-debugging-threads* 5
+ "Maximum number of simultaneous active calls invoke-debuger")
+
+(defvar *debugging-threads* nil
+ "List debugged threads")
+
+(defvar *debugging-threads-lock* (make-lock "debugging threads lock")
+ "A global lock to prevent two threads from modifying *debugging-threads* at
+the same time")
+
(defvar-unbound *acceptor*
"The current ACCEPTOR object while in the context of a request.")
More information about the Bknr-cvs
mailing list