X-Git-Url: http://git.kpe.io/?p=kmrcl.git;a=blobdiff_plain;f=listener.lisp;h=19fbdbe71b317e0e8d494045e283dacef1fb0000;hp=59954057c4c98eeb7c3acccac29c89d8187c0d05;hb=9c61ca103ddac473a3f91ac5baedd45335c369e3;hpb=7a31a7ff629ae760d9c3e3abedf6e03605f83f23 diff --git a/listener.lisp b/listener.lisp index 5995405..19fbdbe 100644 --- a/listener.lisp +++ b/listener.lisp @@ -5,9 +5,9 @@ ;;;; Name: listener.lisp ;;;; Purpose: Listener and worker processes ;;;; Programmer: Kevin M. Rosenberg -;;;; Date Started: Dec 2002 +;;;; Date Started: Jun 2003 ;;;; -;;;; $Id: listener.lisp,v 1.1 2003/07/08 16:12:40 kevin Exp $ +;;;; $Id: listener.lisp,v 1.3 2003/07/10 18:52:10 kevin Exp $ ;;;; ************************************************************************* (in-package #:kmrcl) @@ -29,8 +29,8 @@ :initform nil) (function-args :initarg :function-args :accessor function-args :initform nil) - (process :initarg :process :accessor process) - (socket :initarg :socket :accessor socket) + (process :initarg :process :accessor process :initform nil) + (socket :initarg :socket :accessor socket :initform nil) (workers :initform nil :accessor workers :documentation "list of worker threads") (name :initform "" :accessor name :initarg :name) @@ -46,7 +46,14 @@ (thread-fun :initarg :thread-fun :accessor thread-fun :initform nil) (process :initarg :process :accessor process :initform nil))) +(defmethod print-object ((obj listener) s) + (print-unreadable-object (obj s :type t :identity nil) + (format s "port ~A" (port obj)))) +(defmethod print-object ((obj worker) s) + (print-unreadable-object (obj s :type t :identity nil) + (format s "port ~A" (port (listener obj))))) + ;; High-level API (defun init/listener (listener state) @@ -73,12 +80,21 @@ (warn "~&listener is not in active list") (return-from init/listener listener)) (dolist (worker (workers listener)) - (close-active-socket (connection worker)) - (destroy-process (process worker))) + (with-slots (connection process) worker + (when connection + (errorset (close-active-socket connection) nil) + (setf connection nil)) + (when process + (errorset (destroy-process process) nil) + (setf process nil)))) (setf (workers listener) nil) (with-slots (process socket) listener - (errorset (close-passive-socket socket) t) - (errorset (destroy-process process) t)) + (when socket + (errorset (close-passive-socket socket) nil) + (setf socket nil)) + (when process + (errorset (destroy-process process) nil) + (setf process nil))) (setq *active-listeners* (remove listener *active-listeners*))) (:restart (init/listener listener :stop) @@ -98,12 +114,22 @@ (format nil "~A-worker-~D" base-name (incf *worker-count*))) (defun make-socket-server (listener) - (setf (socket listener) (create-inet-listener - (port listener) - :format (listener-format listener))) - (setf (process listener) (make-process - (name listener) - #'(lambda () (start-socket-server listener)))) + #+lispworks + (progn + (setf (process listener) + (comm:start-up-server :process-name (name listener) + :service (port listener) + :function + #'(lambda (handle) + (lw-worker handle listener))))) + #-lispworks + (progn + (setf (socket listener) (create-inet-listener + (port listener) + :format (listener-format listener))) + (setf (process listener) (make-process + (name listener) + #'(lambda () (start-socket-server listener))))) listener) @@ -151,3 +177,21 @@ (make-process (name worker) (thread-fun worker))) (push worker (workers listener)))))) (errorset (close-passive-socket (socket listener)) nil))) + +#+lispworks +(defun lw-worker (handle listener) + (let ((connection (make-instance 'comm:socket-stream + :socket handle + :direction :io + :element-type 'base-char))) + (if (wait listener) + (apply (listener-function listener) + connection + (function-args listener)) + (let ((worker (make-instance 'worker :listener listener + :connection connection + :name (next-worker-name + (base-name listener))))) + (setf (process worker) + (make-process (name worker) (thread-fun worker))) + (push worker (workers listener))))))