-
-(let ((*listener-socket* nil)
- (*listener-process* nil))
-
- (defun modlisp-start (&key (port +default-apache-port+)
- (function 'sample-process-apache-command))
- (handler-case
- (make-socket-server (next-server-name) function port :format :text
- :wait nil)
- (error (e)
- (format t "Error ~A" e)
- (decf *listener-count*)
- nil)
- (:no-error (proc socket)
- (setq *listener-socket* socket)
- (setq *listener-proc* proc)
- proc)))
-
- (defun modlisp-stop ()
- (when *listener-proc*
- (format t "~&; killing ~d~%" *listener-proc*)
- #+sbcl (sb-unix:unix-kill *listener-proc* :sigalrm)
- #+allegro (mp:process-kill *listener-proc*)
- #+allegro (mp:process-allow-schedule)
- )
- (setq *listener-proc* nil)
- (when *listener-socket*
- (ignore-errors (close *listener-socket*))
- (setq *listener-socket* nil)))
+(defun modlisp-start (&key (port +default-modlisp-port+)
+ (processor 'demo-modlisp-command-processor)
+ (processor-args nil)
+ (catch-errors t)
+ timeout
+ number-fixed-workers)
+ (let ((listener (make-instance 'listener :port port
+ :base-name "modlisp"
+ :function 'modlisp-command-issuer
+ :function-args (cons processor processor-args)
+ :format :text
+ :wait nil
+ :catch-errors catch-errors
+ :timeout timeout
+ :number-fixed-workers number-fixed-workers)))
+ (init/listener listener :start)))
+
+
+(defun modlisp-stop (listener)
+ (init/listener listener :stop))
+
+(defun modlisp-stop-all ()
+ (stop-all/listener))
+
+;; Internal functions
+
+(defun modlisp-command-issuer (*modlisp-socket* processor &rest args)
+ "generates commands from modlisp, issues commands to processor-fun"
+ (unwind-protect
+ (progn
+ (let ((*number-worker-requests* 0)
+ (*close-modlisp-socket* t))
+ (do ((command (read-modlisp-command) (read-modlisp-command)))
+ ((null command))
+ (apply processor command args)
+ (finish-output *modlisp-socket*)
+ (incf *number-worker-requests*)
+ (incf *number-server-requests*)
+ (when *close-modlisp-socket*
+ (return)))))
+ (close-active-socket *modlisp-socket*)))