1 ;;; -*- Mode:Lisp; Syntax:Common-lisp; Package: modlisp; Base:10 -*-
5 (eval-when (compile load eval)
8 (defun make-socket-server (name function port &key wait (format :text))
9 (let* ((listener (socket:make-socket
15 (if (or (null port) (integerp port))
17 (error "illegal value for port: ~s" port)))
19 (proc (mp::process-run-function name
21 (start-socket-server listener function
23 (values proc listener)))
25 (defun worker-process (stream function conn count)
28 (funcall function conn)
30 (excl:errorset (close conn) nil)))
32 (defun start-socket-server (passive-socket function &key wait)
33 ;; internal function run in the server lightweight process
34 ;; that continually processes the connection.
35 ;; This code is careful to ensure that the sockets are
36 ;; properly closed something abnormal happens.
38 (loop (let ((connection (socket:accept-connection passive-socket)))
41 (funcall connection function)
42 (excl:errorset (close connection) nil))
45 (name (next-worker-name))
46 (mp:process-run-function
50 (apache-command-issuer connection function)
53 (apache-command-issuer function connection)
56 (format t "~&Error ~A [~A]~%" e name))
59 (format t "~&~A ended" name)))
60 (excl:errorset (close connection) nil)))
62 (ignore-errors (close passive-socket))))