Revision: 3417 Author: hans URL: http://bknr.net/trac/changeset/3417
Remove WORKERS slot from ONE-SLOT-PER-CONNECTION-MANAGER. Workers were never removed from the list and it was used only for shutdown in LispWorks. As worker processes synchronously check for server shutdown anyway, losing the WORKERS slot was the best option to remove the leak.
U trunk/thirdparty/hunchentoot/connection-manager.lisp
Modified: trunk/thirdparty/hunchentoot/connection-manager.lisp =================================================================== --- trunk/thirdparty/hunchentoot/connection-manager.lisp 2008-07-09 05:52:08 UTC (rev 3416) +++ trunk/thirdparty/hunchentoot/connection-manager.lisp 2008-07-09 05:54:03 UTC (rev 3417) @@ -89,18 +89,11 @@ (process-connection (server manager) socket))
(defclass one-thread-per-connection-manager (connection-manager) - ((workers :initform nil - :accessor connection-manager-workers - :documentation "A list of currently active worker -threads.")) + () (:documentation "Connection manager that starts one thread for listening to incoming requests and one thread for each incoming connection."))
-(defmethod print-object ((manager one-thread-per-connection-manager) stream) - (print-unreadable-object (manager stream :type t) - (format stream "~A worker~:P" (length (connection-manager-workers manager))))) - (defmethod execute-listener ((manager one-thread-per-connection-manager)) #+:lispworks (listen-for-connections (server manager)) @@ -119,30 +112,16 @@ (zerop (mod *worker-counter* *cleanup-interval*))) (when *cleanup-function* (funcall *cleanup-function*))) - ;; start a worker thread for this connection and remember it - (push (mp:process-run-function (format nil "Hunchentoot worker (client: ~{~A:~A~})" - (multiple-value-list - (get-peer-address-and-port handle))) - nil #'process-connection - (server manager) handle) - (connection-manager-workers manager))) + (mp:process-run-function (format nil "Hunchentoot worker (client: ~{~A:~A~})" + (multiple-value-list + (get-peer-address-and-port handle))) + nil #'process-connection + (server manager) handle))
#-:lispworks (defmethod handle-incoming-connection ((manager one-thread-per-connection-manager) socket) - (push (bt:make-thread (lambda () - (process-connection (server manager) socket)) - :name (format nil "Hunchentoot worker (client: ~A:~A)" - (usocket:vector-quad-to-dotted-quad (usocket:get-peer-address socket)) - (usocket:get-peer-port socket))) - (connection-manager-workers manager))) - -#+:lispworks -(defmethod shutdown ((manager one-thread-per-connection-manager)) - ;; kill all worker threads - (dolist (worker (connection-manager-workers manager)) - (ignore-errors - (when (mp:process-alive-p worker) - (mp:process-kill worker))) - (mp:process-allow-scheduling)) - ;; finally, kill main listener - (call-next-method)) + (bt:make-thread (lambda () + (process-connection (server manager) socket)) + :name (format nil "Hunchentoot worker (client: ~A:~A)" + (usocket:vector-quad-to-dotted-quad (usocket:get-peer-address socket)) + (usocket:get-peer-port socket))))